从二叉搜索树中删除节点

Removing A Node From A Binary Search Tree

本文关键字:删除 节点 搜索树      更新时间:2023-10-16

在下面的代码中,我尝试实现基本的删除操作。但是,在开始复杂的删除部分之前,我无法删除叶节点。我想它可以与定义变量的位置相关,但我无法解决它。任何想法将不胜感激。

我想删除节点的部分基本上是作为delete temp;部分实现的(顺便说一下,如果我按delete[]temp;插入它,它仍然不起作用)。

void remove(int value){
        if(root==NULL)
            cout<<"The list is empty!"<<endl;
        else {
            Node *temp=root;
            while(temp!=NULL)
            {
                cout<<"Processing: "<<temp->data<<endl;
                if(value==temp->data)
                {
                    cout<<"Data verified"<<endl;
                    //DELETE ROOT
                    if(temp->left && temp->right) //If it has two children
                    {
                        cout<<"Root with two children"<<endl;
                        return;
                    }
                    if(temp->left || temp->right)
                    {
                        cout<<"Root with a single child"<<endl;
                        return;
                    }
                    else {
                        cout<<"Leaf node"<<endl;
                        delete temp;
                        return;
                    }
                }
                else if(value<temp->data){
                    if(temp->left)
                        temp=temp->left;
                    else
                        return;
                }
                else{
                    if(temp->right)
                        temp=temp->right;
                    else
                        return;
                }

            }
        }
    }

delete运算符不会执行您认为它执行的操作。它的作用是将对象使用的内存标记为未使用,这意味着它可以再次使用(它也调用对象的析构函数,但这在这里无关紧要)。

不会做的是修改指向已删除对象的任何指针,您必须自己执行此操作。

因此,该分支的正确代码必须访问已删除节点的父节点,并将其leftright字段(取决于已删除的节点)设置为 NULL 。只有这样,您才能实际delete节点。