点击查看代码
//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;
}