Delete a node from bst【2月15日学习笔记】

点击查看代码
//Delete a node from bst
#include<iostream>
struct node {
    int data;
    node* left;
    node* right;
};
node* getnewnode(int x)
{
    node* temp = new node;
    temp->data = x;
    temp->left = temp->right = NULL;

    return temp;
}
void insert(node*& travptr, int data) {//Node*& travptr 表示 travptr 是一个引用,引用的是一个指向 Node 类型的指针

    if (travptr == NULL)
    {
        travptr = getnewnode(data);
        return;
    }
    (data > travptr->data) ? insert(travptr->right, data) : insert(travptr->left, data);
}
int findmin(node* run) {//副本
    while (run->left != NULL) {//关注结束条件即可
        run = run->left;
    }//类似链表
    return run->data;
}//时间复杂度:O(logn)in best case(balanced bst)

node* Delete(node* root,int x) {
    if(root==NULL) return root;
    if(x<root->data) root->left=Delete(root->left,x);
    else if(x>root->data) root->right=Delete(root->right,x);
    else {
        if(root->left==NULL&&root->right==NULL) {//删除叶子
            delete root;root=NULL;
        }
        else if(root->left==NULL) {//删除单子节点
            node* temp=root;
            root=root->right;
            delete temp;//temp是局部变量,不用NULL
        }
        else if(root->right==NULL) {//删除单子节点
            node* temp=root;
            root=root->left; 
            delete temp;
        }
        else {//删除双子节点
            int min=findmin(root->right);//右子树最小元素
            root->data=min;//用右子树最小元素占据待删除元素位
            root->right=Delete(root->right,min);//删除右子树最小元素
        } 
    }
    return root;
}

int main() {
    node* root = NULL;
    insert(root, 2);
    insert(root, 1);
    insert(root, 3);
    insert(root, 0);
    insert(root, 5);
    Delete(root,0);
    int x=findmin(root);
    std::cout<<x;
}
posted @ 2024-02-15 15:58  bituion  阅读(13)  评论(0)    收藏  举报