算法导论笔记(5)二叉搜索树

二叉查找树简介

二叉查找树(Binary Search Tree),又被称为二叉搜索树。
它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树就是二叉查找树。

集合操作

search搜索

有迭代版和递归版。
思想都是向下查找合适的值,有值会返回节点,无合适值会一直向下走直到返回null

/*
 * (递归实现)查找"二叉树x"中键值为key的节点
 */
BNode* search(BSTree x, Type key)
{
    if (x==NULL || x->key==key)
        return x;
    if (key < x->key)
        return bstree_search(x->left, key);
    else
        return bstree_search(x->right, key);
}

/*
 * (非递归实现)查找"二叉树x"中键值为key的节点
 */
    BNode* search(DataType key) const{
        BNode *p=root;
        while(p!=NULL&&p->key!=key){
            if (key<p->key)
            {
                p=p->left;
            }else{
                p=p->right;
            }
        }
        if(p!=NULL)
            printf("search %d\n",p->key);
        return p;
    }

mininum寻找子树的最小key节点

最小节点是最左子节点

maxnum子树最大key节点

最大节点是最右子节点

predecessor前序寻找比此节点小的最大节点

两种情况,
正常来说是找次节点的左子树最大节点,如果没有左子树,向上寻找根

    BNode* Predecessor(BNode *T){
        BNode *x=T;
        if (x->left!=NULL)
        {
            return maxmun(x->left);
        }
        BNode *y=x->p;
        while(y!=NULL&&x==y->left){
            x=y;
            y=y->p;
        }
        return y;
    };

succesor后序

同样两种情况,右子树的最小值,或者没有右子树的情况下,向上找根

    BNode* Successor(BNode *T){
        BNode *x=T;
        if(x->right!=NULL){
            return minmun(x->right);
        }
        BNode *y=T->p;
        while(y!=NULL&&y->right==x){
            x=y;
            y=y->p;
        }
        return y;
    }

insert插入

向下插入,
两种情况,有根和无根。注意对root的操作

delete删除

删除节点x
1。无左子树,右子树接上。
2。无右子树,左子树接上。
3。左右都有,寻找右子树最小值y
3.1如果最小值为直接右子树,直接替换接上
3.2不是直接右子树,把y右子树替换y,y再替换x

c++实现

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef int DataType;
struct BNode
{
    DataType key;
    BNode *p,*left,*right;
};
class Btree
{
private:
    BNode *root;
public:
    Btree(){
        root=NULL;
    };
    ~Btree(){
        destoryNode(root);
        root=NULL;
    };
    void Insert(DataType key){
        BNode *z=new BNode;
        BNode *y=NULL;
        BNode *x=root;
        z->key=key;
        z->p=z->right=z->left=NULL;
        //初始化x,y和z
        while(x!=NULL){
            y=x;
            if (x->key>key)
            {
                x=x->left;
            }else{
                x=x->right;
            }
        }//x指向root,向下查找
        z->p=y;
        if (y==NULL)
        {
            root=z;
        }else if(y->key>key){
            y->left=z;
        }else{
            y->right=z;
        }//建立z的双亲节点y与z的联系
        printf("Node %d",z->key);
        if(y!=NULL){
            printf("p %d\n",y->key);
        }else{
            printf("\n");
        }
    };
    BNode* search(DataType key) const{
        BNode *p=root;
        while(p!=NULL&&p->key!=key){
            if (key<p->key)
            {
                p=p->left;
            }else{
                p=p->right;
            }
        }
        if(p!=NULL)
            printf("search %d\n",p->key);
        return p;
    }
    BNode* minmun(BNode *T){
        BNode *p=T;
        while(p->left!=NULL){
            p=p->left;
        }
        printf("%d‘s minmun %d\n",T->key,p->key);
        return p;
    }
    BNode* maxmun(BNode *T){
        BNode *p=T;
        while(p->right!=NULL){
            p=p->right;
        }
        printf("%d‘s maxmun %d\n",T->key,p->key);
        return p;
    }
    BNode* Successor(BNode *T){
        BNode *x=T;
        if(x->right!=NULL){
            return minmun(x->right);
        }
        BNode *y=T->p;
        while(y!=NULL&&y->right==x){
            x=y;
            y=y->p;
        }
        return y;
    }
    BNode* Predecessor(BNode *T){
        BNode *x=T;
        if (x->left!=NULL)
        {
            return maxmun(x->left);
        }
        BNode *y=x->p;
        while(y!=NULL&&x==y->left){
            x=y;
            y=y->p;
        }
        return y;
    };
    void Translate(BNode *u,BNode *v){
        if (u->p==NULL)
        {
            root=v;
        }else if(u->p->left==u){
            u->p->left=v;
        }else{
            u->p->right=v;
        }
        if (v!=NULL)
        {
            v->p=u->p;
        }
    }
    int TreeDelete(BNode *z){
        if (z->left==NULL)
        {
            printf("Translate z z->right\n");
            Translate(z,z->right);
            delete z;
        }else if(z->right==NULL){
            printf("Translate z z->left\n");
            Translate(z,z->left);
            delete z;
        }else{
            BNode *y=minmun(z->right);
            if (y->p!=z)
            {
                Translate(y,y->right);
                y->right=z->right;
                y->right->p=y;
                printf("Translate y y->right\n");
            }
            Translate(z,y);
            y->left=z->left;
            y->left->p=y;
            printf("Translate z y\n");
        }
    }
    void destoryNode(BNode *T){
        if (T->left!=NULL)
        {
            destoryNode(T->left);
        }
        if (T->right!=NULL)
        {
            destoryNode(T->right);
        }
        printf("destory %d\n",T->key);
        BNode *p=T;
        delete p;
    };
};
int main(int argc, char const *argv[])
{
    Btree *T=new Btree();
    T->Insert(3);
    T->Insert(7);
    T->Insert(1);
    T->Insert(12);
    T->Insert(8);
    BNode *t=T->search(12);
    BNode *t1=T->search(3);
    T->maxmun(t);
    T->minmun(t);
    T->TreeDelete(t);
    T->TreeDelete(t1);
    delete T;
    return 0;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。