标签:lchild 结点 二叉 else key BSTree rchild 排序
1、二叉排序树的查找:
typedef struct BSTNOde{
int data;
struct BSTNOde *lchild,*rchild;
}二叉排序树的结构定义
BSTree SearchBST(BSTree T,int &key){
//二叉排序树中的查�?
if((!T)||key==T->data){
return T;
}
else if(key<T->data){
return(SearchBST(T->lchild,key));
}
else{
return(SearchBST(T->rchild,key));
}
//
}STNOde,*BSTree;
2、二叉排序树的插入:
void Insert(BSTree &T,int key){
if(!T){
BSTree s=new BSTNOde;
s->data=key;
s->lchild=s->rchild=NULL;
T=s;
}
else if(key<T->data){
Insert(T->lchild,key);
}
else{
Insert(T->rchild,key);
}
//O(log2(n))
}
3、二叉排序树的创建:
void CreatBST(BSTree &T){
T=NULL;
int e;
cin>>e;
while(e!=0){//结束标志
Insert(T,e);
cin>>e;
}
//O(n*log2(n))
}
4、二叉排序树的删除
他这个一共分为3种情况:
- 当删除的结点是叶子的时候记录双亲并且直接删除
- 当删除的结点只有一个子树的时候就让双亲直接连接上他的唯一子树即可
- 当删除的结点有两个子树的时候就需要找被删结点的左子树的右子树的右子树为空的上一个结点并把它的值赋给被删结点然后再将这个结点的子树(这需要判断看代码)
void DeleteBST(BSTree &T,int key){
BSTree p=T,f=NULL;
while(p){
if(p->data==key){
break;
}
f=p;//f记录的是p的双亲
if(p->data>key){
p=p->lchild;
}
if(p->data<key){
p=p->rchild;
}
}
if(!p){
return ;
}
BSTree q=p;//找到了那个被删除的值并且把它付给p
if(p->lchild&&p->rchild){//他的左右结点都存在时
BSTree s=p->lchild;
while(s->rchild){
q=s;//r是s的双亲
s=s->rchild;
}
p->data=s->data;//将s的值给p接下来只需要处理p
if(q!=p){
//就是s双亲不是p的时侯
q->rchild=s->lchild;
}
else{
q->lchild=s->lchild;
}
delete s;
return ;
}
else if(!p->lchild){
p=p->rchild;
}
else if(!p->rchild){
p=p->lchild;
}
if(!f){
T=p;
}
else if(q==f->lchild){
f->lchild=p;
}
else{
f->rchild=p;
}
delete q;
}
标签:lchild,结点,二叉,else,key,BSTree,rchild,排序 来源: https://blog.csdn.net/qq_56350439/article/details/121730983
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。