下面我发布了我试图用来为二叉搜索树创建解构函数的代码。如果我在删除节点之前消除了将父节点链接到NULL的尝试,则代码运行完美(它将不会永远运行并正确删除节点)。但是,根据我的理解,指针现在指向垃圾数据而不是NULL。我如何解决这个问题或者我试图解决这个问题有什么问题呢? (我得到的错误是“无法读取内存”)。
int BinarySearchTree::postOrderTreeDelete(PhoneInfo * x)
{
static int counter = 0;
if (x == NULL)
{
return counter;
}
else
{
postOrderTreeDelete(x->getLeft());
postOrderTreeDelete(x->getRight());
//deleten(x);
if (x == x->getParent()->getLeft())
x->getParent()->setLeft(NULL);
else if (x == x->getParent()->getRight())
x->getParent()->setRight(NULL);
delete x;
counter++;
}
postOrderTreePrint();
return counter;
}
答案 0 :(得分:0)
如果你正在摧毁树,为什么要在你去的时候创建树的所有中间阶段?
这应该足够了:
int BinarySearchTree::postOrderTreeDelete(PhoneInfo * x)
{
if (!x)
{
return 0;
}
else
{
int counter = 1; // for x
counter += postOrderTreeDelete(x->getLeft());
counter += postOrderTreeDelete(x->getRight());
delete x;
return counter;
}
}
答案 1 :(得分:0)
您应该在析构函数中编写,并完全删除返回的计数:
BinarySearchTree::~BinarySearchTree()
{
delete _left;
delete _right;
}
然后调用者只需使用delete
运算符。
如果您要删除节点,则无需将其数据成员归零。扔掉之前无需抛光垃圾。