前景提要
因为线性表(假定长度为n)在动态的添加和删除的弊端,所以我们引入了二叉搜索树,但是二叉搜索树有多种形式
- 最好的情况是 线性表的 判定树
- 最坏的情况是这颗二叉搜索树的深度为n,每一层一个节点。
最好的情况是这样:
ASL = log2(n + 1) - 1
数量级为O(log2n)
5 第一层
/ \
0 9 第二层
/ \ / \
-1 3 7 12 第三层
最坏的情况是这样:
ASL = (n + 1) / 2
数量级为O(n) ,此时与顺序查找的效率是相同的
-1
\
0
\
3
\
5
\
7
\
9
\
12
所以我们需要尽量将二叉排序树调整为“平衡”一点。为什么?在查找成功的情况下,查找效率实际上是根据层数来的。
平衡二叉树的定义
平衡二叉树是排序树的变种,在这颗树里面,任意一节点的左右子树的高度差最大为1。
所有的叶子节点的深度趋于平衡,这时候查找的效率会更高。
失衡二叉排序树的调整
失衡二叉排序树的调整有四种类型,当前给定一个二叉排序树,插入一个新的点,可能在4个位置上。
假定以前的结构为A->B节点,在B节点后添加了一个节点C,然后发生了不平衡的情况。
如下图(来自王卓老师课程):
调整的方式 看下图(来自维基百科):