解碼時,我無法構建哈夫曼樹的結構。霍夫曼解碼算法
現在我正在編碼的樹,如果它有子碼使前綴0
,如果它沒有孩子使它1
。
例如,像(a,b,c,d)
樹會被編碼爲001a1b01c1d
及其Huffman編碼是
00|01|10|11
注:|
是爲清晰添加的,實際上並不是在頭中。
這裏的圖形形式的樹:
/\
/\ /\
a b c d
現在,當我試圖重建使用001a1b01c1d
樹,我有麻煩的問題是重新創建樹正確,因爲我不能確定檢查什麼當回到樹上時(走多遠)。
Here is the code the index was only added just to try the word 'random' obviously it doesn't work for other cases. I am thinking of using the depth of the tree somehow
void Tree::build(std::queue<char> encodedHeader) {
char currentChar;
this -> thisRoot = new HCNode(0, '\0',0,0,0);
HCNode * newRoot = new HCNode (0,'\0',0,0,0);
HCNode * childZero = new HCNode (0, '\0', 0,0,0);
HCNode * childOne = new HCNode (0, '\0', 0,0,0);
childZero -> p = newRoot;
childOne -> p = newRoot;
newRoot -> c0 = childZero;
newRoot -> c1 = childOne;
this -> foreverRoot = newRoot;
while(!header.empty()) {
currentChar = header.front();
header.pop();
if(currentChar != '\n') {
if (currentChar == '0') {
HCNode * childZero = new HCNode (0, '\0', 0,0,0);
HCNode * childOne = new HCNode (0, '\0', 0,0,0);
child0 -> p = newRoot;
child1 -> p = newRoot;
newRoot -> c0 = childZero;
newRoot -> c1 = childOne;
currentChar = header.front();
while (currentChar == '0') {
newRoot = newRoot -> c0;
header.pop();
currentChar = header.front();
HCNode * childZero = new HCNode (0, '\0', 0,0,0);
HCNode * childOne = new HCNode (0, '\0', 0,0,0);
childZero -> p = newRoot;
childOne -> p = newRoot;
newRoot -> c0 = childZero;
newRoot -> c1 = childOne;
}
}
else {
currentChar = header.front();
header.pop();
if(newRoot -> c0 != NULL) {
newRoot -> c0 -> symbol = currentChar;
newRoot = newRoot -> c1;
}
else {
newRoot -> symbol = currentChar;
while(newRoot -> p != NULL && index != 2) {
index++;
newRoot = newRoot -> p;
}
index = 0;
newRoot = newRoot -> c1;
}
}
}
}
我猜如果你的代碼有問題,你至少應該顯示它的一部分。否則,我們如何才能通過[tag:C++]代碼獲得幫助?你想最終單獨標記[tag:algorithm]? – 2014-10-28 19:32:40
在構建樹之前,或者嘗試對算法進行編碼之前,應首先了解爲什麼需要這樣做以及代表什麼。 http://www.youtube.com/results?search_query=computerphile+huffman – user2485710 2014-10-28 19:40:51
我會說走到下一個正確的孩子。但是你的樹編碼方法似乎很奇怪。 – Jarod42 2014-10-28 19:41:33