这是我的类Node,Traverse
是一种访问霍夫曼二进制树并保存.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);
}
我相信你的回答。
谢谢。
编辑:我已经尝试检查正确的孩子是否为空,但始终无法正常工作。
最佳答案
在第二个版本中,您检查当前节点的左侧节点:
if (p->Left() != NULL)
然后遍历左右两个节点,但不检查右节点是否不是
null
,对于此右节点,递归调用将再次检查p->Left
,但由于p可能为null(当您到达树的叶子时) ),该方法将崩溃。