我必须使用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,因此程序会尝试打印不存在且崩溃的内容。我不确定为什么会这样,我在这里做错了什么?
感谢任何和所有帮助。
答案 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;
}
如果我错了,请纠正我。