这是我的类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(当您到达树的叶子时) ),该方法将崩溃。

07-27 19:41