C++ 这种遍历二叉树的递归方法在一些递归之后崩溃了!为什么?

C++ 这种遍历二叉树的递归方法在一些递归之后崩溃了!为什么?,c++,recursion,binary-tree,huffman-code,C++,Recursion,Binary Tree,Huffman Code,这是我的类节点,遍历是一种访问哈夫曼二叉树并保存.txt文件字符代码的方法Codes是一个字符串向量,我在其中保存代码Temp是一个临时字符串,我在其中保存字符的代码以放入代码 我不明白为什么第一个版本的Traverse工作得很好,而第二个版本在一些递归后崩溃。 typedef class Node *NODE; class Node { private: int Key; NODE L; NODE R; public:

这是我的类节点,
遍历
是一种访问哈夫曼二叉树并保存.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)
};
我相信你的答案。 多谢各位


编辑:我已尝试检查右子节点是否为空,但始终不起作用。

在第二个版本中,您检查当前节点的左节点:

if (p->Left() != NULL)

然后遍历left和right节点,但不检查右节点是否为
null
,对于这个右节点,递归调用将再次检查
p->left
,但因为p可能为null(当到达树叶时)该方法将崩溃。

两个版本都已损坏-在遍历右子树之前,您忘记检查其是否为空


第一个版本似乎可以工作,这只是运气不好,它会给你一些输入带来问题。

我解决了它在上面的
类节点
中,我忘记编写
Ch
成员及其
GetChar()
方法
Ch
是一个无符号字符,而方法
GetChar()
返回一个char,因此在特殊字符的情况下
code[p->GetChar()]
崩溃

你有来自crash的callstack吗?你知道它是在哪个指令上崩溃的吗?我已经试过检查正确的孩子,但总是不起作用。你的版本也崩溃了。无论如何,非常感谢。我删除了我的解决方案,因为我注意到如果代码[p->GetChar()]超出范围,它可能会崩溃。这不会引发异常,但可能会导致您将temp分配给受保护的内存地址,这可能会使您的程序崩溃我解决它!在上面的
类节点
中,我忘记编写
Ch
成员及其
GetChar()
方法
Ch
是一个无符号字符,而方法
GetChar()
返回一个字符,因此如果是特殊字符,当我调用
code[p->GetChar()]
时,它会崩溃!我想写一个答案,但我必须等8小时。我已经试着检查正确的孩子,但总是不起作用。我解决了它!在上面的
类节点
中,我忘记编写
Ch
成员及其
GetChar()
方法
Ch
是一个无符号字符,而方法
GetChar()
返回一个字符,因此如果是特殊字符,当我调用
code[p->GetChar()]
时,它会崩溃!8小时后我会写一个答案。
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)