C ++链接二叉搜索树(DeleteTree)

时间:2011-11-07 22:16:08

标签: c++ binary-search-tree new-operator delete-operator

我必须使用C ++为其中一个分配实现二叉搜索树。我已经创建了这个类,并尝试为该类实现 InsertItem,PrintTree,DeleteTree 方法,我认为我做的一切都正确但由于某种原因我的程序一直崩溃:(

这是我的代码:

PrintTree方法

template <class TItem>
void BinarySearchTree<TItem>::PrintTree()
{
    PrintTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::PrintTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    cout << Node->Data << endl;
    PrintTree(Node->LeftChild);
    PrintTree(Node->RightChild);
}

DeleteTree方法

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree()
{
    DeleteTree(RootNode);
}

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode* Node)
{
    if(Node == NULL)
        return;

    DeleteTree(Node->LeftChild);
    DeleteTree(Node->RightChild);

    delete Node;
}

我的方法序列调用,直到程序崩溃:

我插入了项F,B,G,A,D,I,C,E,H正常工作

我致电PrintTree()正常工作

我致电DeleteTree()正常工作

我再次致电PrintTree()程序崩溃

由于某种原因,在调用if(RootNode == NULL)方法后,表达式DeleteTree()未返回true,因此程序会尝试打印不存在且崩溃的内容。我不确定为什么会这样,我在这里做错了什么?

感谢任何和所有帮助。

2 个答案:

答案 0 :(得分:2)

拨打&#34;删除&#34;不会使指针无效。 你会想要:

delete Node; 
Node = nullptr;

编辑:

按地址传递指针,以便您可以随时清理悬空指针:

void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode *&node);

答案 1 :(得分:2)

我认为删除功能应该更改为以下内容,

template <class TItem>
void BinarySearchTree<TItem>::DeleteTree(BinarySearchTreeNode** Node)
{
    if((*Node) == NULL)
        return;

    DeleteTree(&(*Node)->LeftChild);
    DeleteTree(&(*Node)->RightChild);

    delete (*Node);
    (*Node) = NULL;
}

如果我错了,请纠正我。