У меня возникла проблема с построением структуры дерева Хаффмана при декодировании.Алгоритм декодирования Хаффмана
Прямо сейчас я кодирую дерево, если у него есть дети, делающие префикс 0
, и если у него нет ребенка, сделайте это 1
.
Например, дерево, как (a,b,c,d)
бы быть закодированы как 001a1b01c1d
и их код Хаффмана
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] только в конце концов? –
, прежде чем строить это дерево или пытаться закодировать алгоритм, вы должны сначала понять, зачем вам это нужно и что представляет. http://www.youtube.com/results?search_query=computerphile+huffman – user2485710
Я бы сказал, подойти к следующему правильному ребенку. Но ваш метод кодирования дерева кажется странным. – Jarod42