二叉排序树

二叉排序树

  • 如果这样简单无序存储,删除固然简单,若要查找则困难。
    在这里插入图片描述
  • 故而产生了二叉排序树这样的存储方式。
    在这里插入图片描述
  • 二叉排序树( Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树:
    1 若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值;
    2 若它的右子树不为空,则右子树上所有结点的值均大于它的根结构的值;
    3 即它的左、右子树也分别为二叉排序树(递归)。
查找二叉排序树
//二叉树的二叉链表结点结构定义
    typedef struct Bitnode  
    {
       int data ;
       struct Bitnode *Ichild , *rchild;
    }BITNODE, *Bitree;
    //递归查找二叉排序树T中是否存在key    
    //指针f指向T的双亲,其初始值调用值为NULL    
    //若查找成功,则指针p指向该数据元索结点,并返回TRUE    
    //否则指针P指向查找路径上访问的最后一个结点,并返回 FALSE 
    Status searchbst (Bitree T, int key, Bitree f, Bitree * p)
    {  
      if(!T)    //查找不成功     
      {
        *p=f;
        return FALSE;
      }
      else if(key==T->data)  //查找成功   
      {
        *p=T;
        return TRUE;
      } 
      else if( key< T->data)
      {
        return Searchbst(T->lchi1d,key,T,p); //在左子树继续查找 
      }   
      else 
      {
        return Searches(T-xch11d,key,T,p): //在右子树继续查找 
      }
插入二叉排序树
//当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回TRUE,否则返回 FALSE
 status InsertBST(Bitree *I, int key)
 {
   Bitree p,s; 
   if( !Searches(*T, key, NULL, &p))
   {
     s=(Bitree)malloc(sizeof(Bitnode));
     s->data= key;
     s->lchild=s->rchild= NULL;
     
     if( ! p)
     {
         *t=s; //插入为新的根结点
     }
     else if( key < p->data)
     {
         p->lchild=s; //插入为左孩子
     }
     else if( key < p->data)
     {
         p->rchild=s; //插入为右孩子
     }
     return TRUE;
  }
  return FALSE; //树中已有关键字相同的结点,不再插入 
}    
删除二叉排序树
  Status Delete(B1tree *p)
  { 
      BiTree q,s;
      if((*p)->rchild ==NULL)
      {
        q=*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;
        if (q != *p)
        {
          q->rchild = s->lchild;
        }
        else
        {
          q->lchild = s->lchild;
        }
        free(s);
      }    

平衡二叉排序树

要么Ta是一棵空树,要么Ta的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
我们将二叉树上的结点上的左子树的深度的值减去右子树的深度的值成为平衡因子BF( BalanceFactor),平衡二叉树就是一棵二叉树上所有结点的平衡因子的绝对值小于等于1的树。
在这里插入图片描述
上图转化为下图,即为平衡二叉树的实现
在这里插入图片描述

再举个例子:
在这里插入图片描述
顺序插入后是上图,可在插入过程中转换为下图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值