关于二叉搜索树(BST)的总结

一、二叉搜索树的概念

二叉搜索树(Binary Search Tree)节点放置:任何节点的键值一定大于其左子树的每一个节点的键值,并小于其右子树的每一个节点的键值。

因此,找出BST树的最大元素和最小元素,就是从根节点一直往左走,直至无左路可走,即得最小元素;从根节点一直往右走,直至无右路可走,即得最大元素。


二、二叉搜索树的查找操作

1、二叉树结构定义

//二叉树的二叉链表节点结构定义
typedef  struct BiTNode
{
      int data;
      struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

查找操作:

bool SearchBST(BiTree T,int key,BiTree *p)
{
    if(!T){                    //查找不成功
        *p = NULL;             //p是查找成功之后的节点位置
        return false;
    }else if(key ==T->data)    
    {
        *p = T;
        return true;
    }else if(key < T->data)
        return SearchBST(T->lchild,key,p);
     else
        return SearchBST(T->rchild,key,p); 
}

三、二叉搜索树的插入操作

BST树插入新元素时,从根节点开始,遇到键值较大的值就向左,遇到较小的就向右,一直到尾端,就是插入点。


bool InsertBST(BiTree *T,int key)
{ 
   BiTree p,s;
   if(!SearchBST(*T,key,&p))   //没有查找到
    {
        s = (BiTree)malloc(sizeof(BiTNode));
        s->data = key;
        s->lchild = s->rchild = NULL;
        if(!p)
            *T = s;            //没有查找到则,p为NULL,s从根节点开始
        else if(key <p->data)
            p->lchild = s;
        else 
            p->rchild = s;
        return true;
    }
    else
        return false;            //树中有相同的点
}

四、二叉搜索树的删除操作

删除无非两种情况:如果A只有一个子节点,就直接将A的子节点连至A的父节点,并将A删除;如果A有两个子节点,就以右子树的最小节点或左子树的最大节点取代A即可。




扫描二维码关注公众号,回复: 1801027 查看本文章
bool DeleteBST(BiTree *T,int key)
{
    if(!*T)                        //树空
        return false;
    else
    {
        if(key == (*T)->data)        //找到关键字==key的数据
            return Delete(T);
        else if(key <(*T)->data)
            return DeleteBST(&(*T)->lchild,key);
        else
            return DeleteBST(&(*T)->rchild,key);
    }
}
bool Delete(BiTree *p)
{    
    BiTree q,s;    //辅助指针
    if((*p)->rchild == NULL){    //右子树为空
        q=*p;                    //先保存节点,然后将左孩子指针赋给p,
        *p=(*p)->lchild;
        free(q);
    }
    else if((*p)->lchild == NULL){
        q=*p;
        *p=(*p)->rchild;
        free(q);
    }
    else //左右子树皆存在
    {
        q=*p;
        s=(*p)->lchild;
        while(s->rchild)    //循环找到左子树的最大节点
        {
            q=s;s=s->rchild;
        }
        (*p)->data=s->data; //将最大节点的值赋给p
        if(q!=*p)
            q->rchild = s->lchild;
        else
            q->lchild = s->lchild;
        free(s);
    }
    return true;
}

图解:




猜你喜欢

转载自blog.csdn.net/qq_32164245/article/details/80519823
今日推荐