二叉排序树

   在复习数据结构,把这个东西总结一下。

 

  这种结构是动态查找表,这种动态是相对静态查找(顺序查找,折半查找,分块查找等)来说的。对于各种静态链表,要达到查找复杂度为O(logn),必须要求有序;而要使插入删除复杂度为O(1),必须是链表存储。动态查找表就可以同时满足这两者。

 

  动态查找表的特点是表结构本身在查找过程中动态生成,即对给定的关键字key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录.

  

  二叉排序树定义:二叉排序树要么是空树,要么是满足以下条件的树

      (1)若它的左子树不空,则左子树上的所有节点值都小于双亲节点的值

      (2)若它的右子树不空,则左子树上的所有节点值都大于双亲节点的值

      (3)双亲节点的左右子树也是二叉排序树

  是一个递归定义。

 

  对于任何一个二叉排序树进行中序遍历,可得到一个有序序列(因为中序遍历访问顺序是“左根右”,有二叉排序树的定义可知,一定得到有序序列)。所以可以将其看成一个有序表,它与二叉查找树的区别是,后者是由有序表构成的,而二叉排序树是可以由无序序列构成。

 

 (一)查找算法

  中文描述:

   1.若树空,则查找失败,退出

   2.若树非空

       21.若查找的值等于根节点的值,则查找成功。

       22.若查找的值小于根节点的值,则递归查找左子树

       23.若查找的值大于根节点的值,则递归查找右子树

 

 

c语言描述:

 

 BOOL SearchBST(BiTree bt,KeyType key,BiTree f,BiTree p){

   if (!bt){p=f; return false;}//查找失败

   else {

        if EQ(bt->data.key,key){p=bt; return true;}//查找成功

        else if LT(bt->data.key,key) SearchBST(bt->lchild,key,bt,p);//递归查找左子树

        else  SearchBST(bt->lchild,key,p);

         }

   }
 

  而动态查找表的动态性还体现在,当查找失败时并不是什么都不做,而是将其插入查找表中,如对于二叉排序树,要将每个查找失败的节点插入树中,而且都是插入到叶子节点。上面的p指针即是返回查找到的节点或者查找失败的节点留作插入用。

  

   插入算法:

     BOOL Insert(BiTree bt,BiTree &p)

   {

       if(!SearchBST(Bbt, key, NULL, p))

       {

            s=(BiTree)malloc(sizeof(BiTNode));

            s->data = key;

            s->lchild = s->rchild = NULL;

            if(!p)  bt = s;//树空

            else if LT(p.key,key)  p->rchild = s;

            else    p->lchild = s;

            

            return true;

        }else return false;

}

               

      (未完待续)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值