从二叉搜索树中删除

时间:2013-10-24 03:24:28

标签: c++

我正在尝试从二叉树函数中删除一个。我有点失落所以我试图逐个处理它,从我试图删除的值是否在BST的根目录开始。为了测试我的函数,我首先调用printcontents()函数打印树的所有内容,然后我调用remove(8)[8表示我的root中的值),然后调用printcontents( )再次。我这样做的方法是尝试用树的左侧的“最右边”值替换根。当我第二次调用printcontents时,它会正确打印新的根值,但是当它继续打印内容并到达该值的位置时,它会有一个随机的长数字“-572 ......” (虽然我不认为这个数字很重要)然后我的程序崩溃了。我看到我的root的值正在被替换,但之后会发生什么?

这是我的删除功能:

void BinarySearchTree::remove(int value) {

      Node* tmp = head;
      Node* tmp2 = head;


     if (head->data == value && head->left != NULL) {

        tmp=tmp->left;

        while (tmp->right != NULL) {
            tmp=tmp->right;

        }

        while (tmp2->right->right != NULL) {
            tmp2=tmp2->right;

        }

        if (tmp->left == NULL) {     

        head->data = tmp->data;
        tmp2->right = NULL;
        delete tmp;

        }

        if (tmp->left != NULL) {

            head->data = tmp->data;
            tmp2->right = tmp->left;
            delete tmp;

        }




}

它显然是不完整的,但我正在测试它只处理删除根的情况,并替换为树左侧的最右边的值(假设有左侧,有),我觉得逻辑上它应该工作,所以也许是当我“删除tmp”时出现问题。我不知道是否有必要发布我的整个程序,但如果是的话,请告诉我!

1 个答案:

答案 0 :(得分:1)

我是否可以建议不要为root写出来,为什么不对待CLRS中处理的案例:这是两个截然不同的案例。 1.当要删除的节点是叶子时 2.当要删除的节点是非叶子时(在这种情况下将其替换为inorder successor / predecessor)。

根删除显然属于第二种情况。这只是一个建议。