二叉查找樹相關

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章