二叉查找树相关

<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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值