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

时间:2014-01-19 15:33:26

标签: c++ recursion binary-tree huffman-code

这是我的类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);
}

我相信你的答案。 谢谢。

编辑:我已经尝试检查正确的孩子是否为空,但始终无效。

3 个答案:

答案 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()]崩溃!