这是我的类Node,Traverse
是一种访问Huffman二叉树并保存.txt文件字符代码的方法。 Codes
是一个字符串向量,我保存代码。 Temp
是临时字符串,我将字符的代码保存到代码中。
我不明白为什么Traverse
的第一个版本效果很好而第二个在一些递归之后崩溃。
typedef class Node *NODE;
class Node {
private:
int Key;
NODE L;
NODE R;
public:
Node() { L = NULL; R = NULL};
Node(int, NODE, NODE);
~Node() { delete L; delete R;};
NODE Left();
NODE Right();
int GetKey();
void SetKey(int);
void Traverse(vector<string>, string)
void Traverse(NODE, vector<string>, string)
};
第一版:
void Node::Traverse(vector<string> &Codes, string Temp = "")
{
if (L != NULL)
{
L->Traverse(Codes, Temp + "0");
R->Traverse(Codes, Temp + "1");
}
else
{
Codes[Ch] = Temp;
Temp.clear();
}
}
第二版:
void Node::Traverse(NODE p, vector<string> &Codes, string Temp = "")
{
if (p->Left() != NULL)
{
Traverse(p->Left(), Codes, Temp + "0");
Traverse(p->Right(), Codes, Temp + "1");
}
else
{
Codes[p->GetChar()] = Temp;
Temp.clear();
}
}
主:
int main()
{
// I Create the Huffman tree and save it's root into H_Tree pointer to Node.
// It works great!
H_Tree->Traverse(Codes, Temp);
// It doesn't work!
H_Tree->Traverse(H_Tree, Codes, Temp);
}
我相信你的答案。 谢谢。
编辑:我已经尝试检查正确的孩子是否为空,但始终无效。
答案 0 :(得分:1)
在第二个版本中,检查当前节点的左侧节点:
if (p->Left() != NULL)
然后遍历左侧和右侧节点,但不检查右侧节点是否为null
,对于此右侧节点,递归调用将检查p->Left
再次,但由于p可能为null(当你到达树叶时),该方法将崩溃。
答案 1 :(得分:0)
两个版本都被破坏了 - 在遍历之前忘记检查右子树是否为空。
第一个版本似乎工作只是运气不好,将给你一些输入问题。
答案 2 :(得分:0)
我解决了!在上面的class Node
我忘了写Ch
成员及其GetChar()
方法。 Ch
是 unsigned char ,而方法GetChar()
返回 char ,因此如果特殊字符Codes[p->GetChar()]
崩溃!