二叉排序树(BST)--平均查找长度

什么是二叉排序树的平均查找长度?二叉排序树的平均长度怎么计算?

    这是这篇文章要回答的两个问题。对于一棵二叉排序树而言,当输入一个值要对它查找的时候,最后就只有两种结果,第一种是查找成功,第二种则是查找失败。所以在讨论一棵二叉树的平均查找长度的时候我们从查找成功和查找失败两个方向来进行讨论。

     查找成功顾名思义就是输入一个关键字的值,最后在给定的二叉排序树中找到了这个值。那什么叫做查找成功的平均查找长度呢?其实就是查找二叉树的每一个关键字需要比较的次数之和除以关键字的个数。

  查找失败根据字面意思就是输入一个关键字的值,最后在给定的二叉排序树中没有找到这个值,那什么叫做查找失败的平均查找长度呢?其实就是二叉排序树的结点补上叶子结点后,(查找补上的叶子结点的次数之和)除以(总的结点个数+1)

下面我们以两个例子为例:

例子1:一棵二叉树按先序遍历得到的序列为(50,38,30,45,40,48,70,60,75,80),试画出该二叉排序树,并求等概率下查找成功和查找失败的平均查找长度。

分析:对于本题,我们需要先把二叉排序树构造出来。

回想二叉树的构造过程,我们可以知道二叉树的中序遍历是一个递增有序的过程。所以我们将上述序列由小到大排序就是该二叉树的中序序列(30,38,40,45,48,50,60,70,75,80)。根据二叉树的性质,已知一棵树的先序遍历和中序遍历或者后序遍历和中序遍历可以唯一确定一颗二叉树。

特别注意在写本题的时候,构造二叉树是按先序遍历和中序遍历进行构造的,千万千万别写着写着就想起二叉排序树的性质左孩子的值<根结点的值<右孩子的值。然后按照这个性质进行构造。

下面我们来看看具体是如何构造的:

首先根据先序序列可知50是该树的根结点,根据中序遍历可知分布在50左边的关键字都在以50为根结点的左子树上,分布在50右边的关键字都在以50为根结点的右子树上。

先序遍历的下一个关键字是38,根据中序遍历可知38在50的左边,所以把38插入到50的左孩子的位置。根据中序遍历可知分布在38左边的关键字都在以38为根结点的左子树上,分布在38右边的关键字都在以38为根结点的右子树上。

先序遍历的下一个关键字是30,根据中序遍历可知30在38的左边,所以把30插入到38的左孩子的位置。根据中序遍历可知分布在30左边的关键字都在以30为根结点的左子树上,分布在30右边的关键字都在以30为根结点的右子树上。

先序遍历的下一个关键字是45,根据中序遍历可知45在30的右边,所以把45插入到30的右孩子的位置。根据中序遍历可知分布在45左边的关键字都在以45为根结点的左子树上,分布在45右边的关键字都在以45为根结点的右子树上。40和48的过程比较简单就直接画上去了。

先序遍历的下一个关键字是70,根据中序遍历可知70在50的右边,所以把70插入到50的右孩子的位置。根据中序遍历可知分布在70左边的关键字都在以70为根结点的左子树上,分布在70右边的关键字都在以70为根结点的右子树上。60的过程比较简单就直接画上去了。

先序遍历的下一个关键字是75,根据中序遍历可知75在70的右边,所以把75插入到70的右孩子的位置。根据中序遍历可知分布在75左边的关键字都在以75为根结点的左子树上,分布在70右边的关键字都在以75为根结点的右子树上。80的过程比较简单就直接画上去了。

二叉树的构造完成了,我们可以采用先序遍历再检验一遍构造的二叉树是不是对的。经过检验,构造的二叉树是正确的,下面我们开始计算平均查找长度。

我们先来看查找成功的平均查找长度:

要查找50 则只需要比较一次就可以判断是否成功

要查找38 则需要比较两次才可以判断是否查找成功

查找30 则需要比较三次才可以判断是否查找成功

......

按照这个规律,我们不难发现每个关键字查找成功的次数与其所在的层数的有关

那么平均查找长度=查找每个关键字需要比较的次数之和/关键字的个数

接着我们再来看查找失败的平均查找长度:

分析:我们需要把树上所有结点的叶子结点补齐,然后用每次查找叶子结点的次数之和/关键字的个数+1(因为还有一个父节点要加上),就可以计算出查找失败的平均查找长度。为什么要找空的叶子结点呢?因为空的叶子结点代表位置为空,当顺着当前路径比较完所有关键字的值都没有找到这个关键字在哪,是不是就可以认为是查找失败的呢?

下面我们来把叶子结点补齐是这样的:

在哪一层补齐的就用哪一层的关键字个数乘以那一层的层数

举个例子,比如说在第3层补上了五个叶子结点那么就是3*5,在4层补上了6个结点就是4*6

下面就是查找失败的平均查找长度:

特别注意分母是总结点数+1

总结一下,第一个例子特别容易犯错的地方有:

1)二叉树的构造是按照先序遍历和中序遍历可以唯一确定一棵二叉树来构造的,千万千万不能写着写着就写成了二叉排序树的构造过程

2)查找失败的平均查找长度是在哪层补上了叶子结点就乘以哪层的层数,而且分母是关键字的总结点之和+1

例子2:按照序列(40,72,38,35,67,51,90,8,55,21)建立一棵二叉排序树,画出该树,并求出在等概率的情况下查找成功的平均查找长度。

分析:要分析查找成功的平均查找长度,我们需要先把二叉树构造出来

这棵二叉树二叉树的构造就是按照左孩子的值<根结点的值<右孩子的值构造的。

下面我们来进行构造:

首先判断第一个关键字40与当前根结点的值的大小,发现当前根结点为空,那么说明这是一棵空树,直接将40插入其中,如下图所示:

下一个关键字的值是72,首先判断与当前根结点40的值谁大谁小,72>40发现关键字的值大于根结点的值,往右再与根结点为40的右孩子的值进行比较,此时发现根结点为40的右孩子的值为空,说明这里有一个空位置,于是将72插入到根节点为40的右孩子的位置。

下一个关键字的值是38,首先判断与当前根结点40的值谁大谁小,38<40发现关键字的值小于根结点的值,往左再与根结点为40的左孩子的值进行比较,此时发现根结点为40的左孩子的值为空,说明这里有一个空位置,于是将38插入到根节点为40的左孩子的位置。

下一个关键字的值是35,首先判断与当前根结点40的值谁大谁小,35<40发现关键字的值小于根结点的值,往左再与根结点为40的左孩子的值进行比较,此时发现关键字的值小于根结点为40的左孩子的值35<38,往左,将根节点为40的左孩子的值38作为新的根结点,由于35小于38,此时与根结点为38的左孩子的值进行比较,这时发现根结点为38的子树没有左孩子,说明这里有一个空位置,于是将35插入到根节点为38的左孩子的位置。将下一个关键字67也做同样的操作得到的二叉排序树如下图所示:

随后对关键字51,90,8,55,21进行同样的操作最终得到的二叉排序树如下图所示:

这样一棵二叉树就构造完成了!如果这里的知识掌握的不好了那么请看关于二叉树的构造那篇文章。

构造完成之和别忘了回头进行检查一遍,利用二叉排序树的两个性质,左孩子的值<根结点的值<右孩子的值和中序遍历二叉排序树是一个递增有序的序列。

下面我们对其查找成功的平均查找长度进行分析:

下面对查找成功的平均查找长度进行计算:

下面我们对查找失败的平均查找长度进行分析:

下面对查找失败的平均查找长度进行计算:

以上就是二叉排序树成功的平均查找长度和失败的平均查找长度如何计算的问题。

这个知识点不难,但是需要特别细心,有些树画着画着就写错了,还有层数和关键字的结点数这些都特别的容易在写的时候一不小心就写错了!写完之后一定得回过头来再仔细检查一遍!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值