二叉排序树
一、性质
- 左子树 < 根节点
- 右子树 > 根节点
- 中序遍历的结果,是一个有序序列
数据结构,就是定义一种性质,并且维护这种性质。
二、插入操作
- 插入的新节点,一定会做为叶子结点
三、删除操作
- 删除度为0的节点,直接删除
- 删除度为1的节点,把『孤儿子树』挂到其父节点上面去
- 删除度为2的节点,可以转化成删除度为1的节点
对于度为2的节点:
- 前驱:左子树最大值
- 后继:右子树最小值
四、随堂练习
- 插入顺序会影响最终的树形结构
- 不同的树形结构,查找效率不同
平均查找效率:节点查找次数的期望值,$\frac{总次数}{节点数量}$,假设每个节点等概率的被查找
五、扩展内容
- 二叉排序树的删除代码优化
- 删除掉处理度为0的代码逻辑,不影响代码整体功能
- 如何解决==排名==相关的检索需求
- 修改二叉排序树的结构定义,增加 size 字段,记录每棵树的节点数量
- $k = LS - 1$,根节点就是排名第 k 位的元素
- $k \le LS$,排名第 k 位的元素在左子树中
- $k \gt LS,search_k(root->rchild, k - LS - 1)$
- 解决 Top-K 问题(找到小于第 k 位的所有元素)
- 根节点就是第 k 位元素的话,就把左子树中的值全部输出出来
- 第 k 位在左子树中,前 k 位元素全都在左子树中
- 第 k 位在右子树中,说明根节点和左子树中的元素,都是前 k 位元素里面的值
- 二叉排序树和快速排序的关系
- 二叉排序树是快速排序在思维逻辑结构层面用的数据结构
- 思考1:快速排序的时间复杂度和二叉排序树建树时间复杂度之间的关系
- 思考2:快速选择算法和二叉排序树之间的关系
- 程序=算法+数据结构
所谓算法设计及分析能力:分类讨论及归纳总结的能力