我早先對算法和實現提出了一個問題,但遇到了一個我無法解決的問題。霍夫曼解碼樹的奇怪問題
我能夠從文本文件採取的前綴,並讓他們進入一個載體,例如:
a 0
b 100
c 101
d 11
。
[0, a, 1, 0, 0, b, 1, 0, 1, c, 1, 1, d]
所以我的代碼:
- 開始於根節點
- 迭代通過向量。如果我們得到一個0,取當前節點並讓它的指針指向一個新節點。如果我們得到1,則取當前節點並將其正確的指針指向新節點。如果是字母,則將該字符存儲到當前節點並從根開始。
(一個節點只包含一個值和具有左右指針)
void Foo:: build(vector<char> v) {
node* root = new node;
vector<char>:: iterator itr;
node* current = root;
cout << " *" << endl;
for(itr = v.begin(); itr != v.end(); itr++) {
cout << "(" << *itr << ")" << endl;
if (!isdigit(*itr)) {
current->value = *itr;
current = root;
cout << "*" << endl;
}
if (*itr == '0') {
cout << "<-" << endl;
current->left = new node;
current = current->left;
}
if (*itr == '1') {
cout << "->" << endl;
current->right = new node;
current = current->right;
}
}
nodeVector.push_back(*root);
}
。 如果你對cout好奇,*表示在根。因此對於'a',它將從根*開始,遇到0並且轉到< - 向左放置該'節點',然後從根*開始。我只是這樣做,看看它是否應該像是應該的那樣左右移動,而且看起來沒問題。
*
(0)
<-
(a)
*
(1)
->
(0)
<-
(0)
<-
(b)
*
(1)
->
(0)
<-
(1)
->
(c)
*
(1)
->
(1)
->
(d)
*
我遇到的問題很奇怪。唯一可以工作的字母是'a'和'd'。例如,root->left->value
會給我'a',root->right->right->value
會給'd',但root->right->left->right->value
應該是'c'似乎並不像它曾經放在節點位置。當我嘗試獲取此值時,我的程序崩潰。當我嘗試解碼一串比特時,該消息是不正確的,因爲它只能執行'd'和'a'。這讓我懷疑這是樹的建築。任何建議將不勝感激!
是的,這次我懶了,沒有做一個合適的構造函數,回來困擾了我!我的解碼信息仍然不正確,所以事實證明這裏也存在一個問題,但我可以確認所有的字符都正確現在在樹上,我應該能夠照顧其餘的人對你倆都是。 – kayla