<pre style="color: rgb(51, 51, 51); font-size: 13px;">#include <iostream>
struct Tree{//树结构
int key;
Tree *left,*right,*p;
};
// 返回指向树中最大值所在节点
Tree* Tree_max(Tree* rt){
while(rt->right!=nullptr)
rt=rt->right;
return rt;
}
//返回树中最小值所在节点
Tree* Tree_min(Tree* rt){
while(rt->left!=nullptr)
rt=rt->left;
return rt;
}
//返回节点的直接后继节点
Tree* next(Tree *rt){
if(rt->right!=nullptr)
return Tree_min(rt->right);
Tree *x=rt,*y=x->p;
while(y!=nullptr && x==y->right){
x=y;
y=y->p;
}
return y;
}
//返回节点的直接前驱节点
Tree* pre(Tree *rt){
if(rt->left!=nullptr)
return Tree_max(rt->left);
Tree *x=rt,*y=x->p;
while(y!=nullptr && y==x->left){
x=y;
y=y->p;
}
return y;
}
//插入节点z,z的左右子树初始化为空
void insert(Tree* rt,Tree* z){
Tree* x=rt,y=nullptr;
while(x!=nullptr){
y=x;
if(z->key<x->key)
x=x->left;
else x=x->right;
}
z->p=y;
if(y==nullptr) rt=z;
else if(z->key<y->key)
y->left=z;
else y->right=z;
}
//用y子树来替换x子树,允许y为空树。用于在删除节点的操作中使用
void replace(Tree* x,Tree* y){
if(x->p=nullptr){
rt=y;y->p=nullptr;
}
else if(x==x->p->left){
x->p->left=y;
}
else x->p->right=y;
if(y!=nullptr) y->p=x->p;
}
//删除节点z,分三种情况解决
void Tree_delete(Tree *rt,Tree *z){
if(z->left==nullptr) replace(z,z->right);
else if(z->right==nullptr) replace(z,z->left);
else{
Tree* y=Tree_min(z->right);
if(y->p!=z){
replace(y,y->right);
y->right=z->right;
y->right->p=y;
}
replace(z,y);
y->left=z->left;
y->left->p=y;
}
}
二叉查找树相关
最新推荐文章于 2024-03-25 18:55:55 发布