Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二叉搜索树解构器_C++_Memory_Binary Search Tree - Fatal编程技术网

C++ 二叉搜索树解构器

C++ 二叉搜索树解构器,c++,memory,binary-search-tree,C++,Memory,Binary Search Tree,下面我发布了我试图用来为二叉搜索树创建解构器的代码。如果我在删除节点之前消除了将父节点链接为NULL的尝试,那么代码将不会永远正常运行,并正确删除节点。然而,据我所知,指针现在指向垃圾数据,而不是NULL。我该如何解决这个问题,或者我试图解决这个问题有什么问题?我得到的错误是无法读取内存 int BinarySearchTree::postOrderTreeDelete(PhoneInfo * x) { static int counter = 0; if (x =

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


如果要删除节点,则无需将其数据成员归零。在你扔掉垃圾之前,不需要把垃圾擦亮。

如果树只有2或3层,会发生什么?您是否使用调试器调试该问题?在函数名中提及postOrder毫无意义,因为这是删除树的唯一合理方法。