树表的查找 --- 二叉排序树

           引言:前面介绍的3 种查找方法都是用线性表作为查找表的组织形式,其中折半查找效率较高。但 由千折半查找要求表中记录按关键字有序排列,且不能用链表做存储结构,因此,当表的插入或 删除操作频繁时,为维护表的有序性,需要移动表中很多记录。这种由移动记录引起的额外时间 开销,就会抵消折半查找的优点。 所以,线性表的查找更适用千静态查找表,若要对动态查找 表进行高效率的查找,可采用几种特殊的二叉树作为查找表的组织形式,在此将它们统称为树 表。 本节将介绍在这些树表上进行查找和修改操作的方法。

 二叉排序数

        定义:二叉排序树 (Binary Sort Tree) 又称二叉查找树,它是一种对排序和查找都很有用的特殊二 叉树。

        二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

                1)若它的左子树不空,则左子树上所有结点的值均小千它的根结点的值;

                (2) 若它的右子树不空,则右子树上所有结点的值均大千它的根结点的值;

                (3) 它的左、 右子树也分别为二叉排序树。 二叉排序树是递归定义的。 由定义可以得出二叉排序树的一个重要性质:中序遍历一棵二叉 树时可以得到一个结点值递增的有序序列。

  给大家展示个二叉排序树:  通过二叉排序树的中序遍历序列:3, 12, 24, 37, 45, 53, 61, 78, 90, 100  可知,整个序列是递增序列,从小到大排列。 其原因其实就是:二叉排序树性质是小于根节点的数在左子树,而大于等于根节点的数位于右子树。

由此对于其中的字母排序:中序序列就为:CAO, CHEN, DING, DU, LI, MA, WANG, XIA,ZHAO 

在下面讨论二叉排序树的操作中, 使用二叉链表作为存储结构。 因为二叉排序树的操作要根 据结点的关键字域来进行,所以下面给出了每个结点的数据域的类型定义(包括关键字项和其他 数据项)。

//- - - - -二叉排序树的二叉链表存储表示-----
typedef struct{
       KeyType key;            //关键字项
       InfoType otherinfo;     //其他数据域
}ElemType;        // 每个结点的数据域的类型

typedef struct BSTNode
{

    ElemType data;        //每个结点的数据域包括关键字和其他数据项
    struct BSTNode *lchild,*rchild;    每个孩子数的指针
}BSTNode,*BSTree;

二叉排序树的查找

        因为二叉排序树可以看成是一个有序表,所以在二叉排序树上进行查找 和折半查找类似, 也 是一个逐步缩小查找范围的过程。

        二叉排序树的递归算法的查找

        算法步骤:

                ①若二叉排序树为空, 则查找失败,返回空指针。

                ②若二叉排序树非空, 将给定值key与根结点的关键字T->data.key进行比较:

                         • 若key等于T->data.key, 则查找成功,返回根结点地址; -

                        • 若key小 于T->data.key, 则递归查找左子树;

                        • 若key大于T->data.key, 则递归查找右子树。

通过递归形式的算法如下所示

BSTree SearchBST (BSTree T, KeyType key) {
    //在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素
    //若查找成功 , 则返回指向该数据元素结点的指针, 否则返回空指针
    
    
    if ((!T) || key==T->data.key) return T; //查找结束
    else if (key<T->data. key) return SearchBST (T->lchild, key); //在左子树中继续查找
    else return SearchBST (T->rchild, key) ; //在右子树中继续查找
}

通过二叉排序树 计算平均查找长度 

          

平均查找长度为:ASL = (1+2+2+3+3+3)/6  = 14/6  

        第一层:一个结点 深度为1,第二层两个结点深度为2....以此类推,然后将所有的相加

平均查找长度为:ASL = (1+2+3+4+5+6)/6  = 21/6  

  因此,含有 n个结点的二叉排序树的平均查找长度和树的形态有关。当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树。树的深度为n, 其平均查找长度n+1/2(和顺序查找相同),这是最差的情况显然,最好的情况是,二叉排序树的形态和折半查找的判定树相似,其平均查找长度和 log2-n(以2为低)成正比。若考虑把 n个结点按各种可能的次序插入到二叉排序树中,则有n! 棵二叉排序树(其中有的形态相同)。可以证明,综合所有可能的情况,就平均而言,二叉排序树 的平均查找长度仍然和 log2n是同数量级的

        可见,二叉排序树上的查找和折半查找相差不大。但就维护表的有序性而言,二叉排序树更 加有效,因为无需移动记录,只需修改指针即可完成对结点的插入和删除操作。因此,对于需要 经常进行插入、 删除和查找运算的表,采用二叉排序树比较好

《《下期预告:将重点讲解 二叉排序树的插入、删除等操作》》

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值