考研之数据结构017_二叉排序树(BST)

在这里插入图片描述

一、二叉排序树的定义

1.二叉排序树,又称“二叉查找树”(BST,Binary Search Tree)一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:
左子树结点值<根节点值<右子树根节点值

2.所以如果二叉树进行中序遍历(左根右),可以得到一个递增的有序序列
3.二叉排序树可用于元素的有序组织、搜索。
在这里插入图片描述

二、查找操作

1.非递归形式:(效率更好)

1.若树非空,目标值与根节点的值进行比较:
若相等,则查找成功。
若小于根节点,则在左子树上查找,否则在右子树上查找。
查找成功,则返回结点指针。
如果最后一个结点也是错误的,那么就会执行:否则指向右子树查找,明知右子树为null,所以返回的就是null。
在这里插入图片描述

2.递归形式实现查找:

由于二叉排序树的递归特性,我们也可以用递归方式来实现查找。
在这里插入图片描述

三、插入操作

进行了插入操作,也要保持二叉排序树的特性,所以我们也要用查找的逻辑找到要查找的具体位置,
注意的是:
1.不能插入相等的值(重复的结点)。
2.插入的结点,一定要是叶子结点
在这里插入图片描述

在这里插入图片描述

四、二叉排序树的构造(常考)

左子树结点值<根节点值<右子树根节点值
在这里插入图片描述
各个结点的插入的顺序不同,我们得到的形状不一样的二叉排序树。
在这里插入图片描述

五、删除操作

1.如果删除的是叶子结点

删除结点是叶子结点,那么直接删除,不会破坏二叉排序树的性质。

那么还会保持二叉排序树的特性:左子树结点值<根节点值<右子树根节点值

2.如果删除的->只有左/右子树

那么就让删除的该节点的左、右子树进行替代。

3.如果删除的->左右子树都有

在这里插入图片描述

1.找后继来替代要删除的结点。

1.删除的该结点的,右子树当中找到值最小的结点。用这个值来替代,删除的结点。
2.其实就是找到右子树当中,按着中序遍历第一个被访问的结点。是因为:对排序树进行中序遍历,可以得到一个递增的有序序列,所以找到右子树当中,按着中序遍历被访问的第一个结点,那么肯定是右子树当中最小的结点
3.总结:如何找到要删除结点的右子树当中最小的结点??
那就是要删除结点的右子树中,最左下的结点(可以是叶子,也可能是结点,比如说该节点还有右子树)。
在这里插入图片描述

2.找前驱来替代要删除的结点Z。

例如:要删除的结点是:Z
1.用前驱替代Z。也就是要找到当前结点,他的左子树当中最大的值来替代当前删除的结点Z。依然可以保证二叉排序树的特性。
2.Z的前驱:Z的左子树中最右下结点(肯定没有右子树)
在这里插入图片描述

六、查找效率分析(重要)

1.查找长度:在查找运算中,需要对比关键字的次数称为查找长度,反映了查找操作时间复杂度。
2.在查找时,每一次的对比,就相当于一次循环。分析查找长度,反应了查找时间复杂度。所以:
查找长度 应该等同于 查找时间复杂度

3.下面图是:查找成功的平均查找长度

4.如何计算:
每个结点:需要对比结点的次数 * 有几个结点(兄弟结点) ,进行相加,在除以n个结点。

5.若树高为h,找到最下层的一个结点需要对比h此,
6.最好情况:n个结点的二叉树最小高度:

在这里插入图片描述

平均查找长度就是说,找到其中任何一种查找概率是:2.525(所有节点的查找平均长度 也就是需要对比几次关键字的对比)
在这里插入图片描述
4.查找失败:第四行查找失败的个数有7个,第五行的两个。
第四行需要比较三次能到达第四行。
第五行需要比较四次能到达第五行。

(其中某一结点 乘以 需要比较的次数 )/n个结点
所有加起来的值,再除以总结点数

ASL=(73+24)/9=3.22
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43989347/article/details/116611879