<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;
}
}
二叉查找樹相關
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.