二进制搜索树解构器

Binary Search Tree Deconstructor

本文关键字:搜索树 二进制      更新时间:2023-10-16

下面我发布了我试图用来创建二进制搜索树的解构器的代码。如果我在删除节点之前消除了将父节点链接到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;
}

如果您无论如何都要破坏树,为什么要在执行过程中创建树的所有中间阶段?

这就足够了:

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;
    }
}

您应该在析构函数中写入这个,并完全清除返回的计数:

BinarySearchTree::~BinarySearchTree()
{
    delete _left;
    delete _right;
}

那么调用者只需要使用delete运算符。

如果要删除一个节点,则不需要同时将其数据成员清零。在你把垃圾扔掉之前,不需要把它擦亮。