AVL Trees
Def.
新结点的插入可能会破坏平衡:
Rotation
left-heavy & right-heavy
将结点的平衡因子定义为:左子树高 - 右子树高
left-heavy说明平衡因子为1,right-heavy说明平衡因子为-1
下面讨论如何对 最小不平衡子树 进行调整 :
(这里为了确保所讨论的最小平衡子树以 A为根,示例中 BL,BR和 AR均为高 H的子树)
LL
RR
LR
RL
小结
左边重就往右旋
右边重则往左旋
Steps
- 具体来说,首先自下向上找到最小的不平衡子树;
- 然后针对这棵子树,分析不平衡原因是以上四种的哪一个;
- 如果为:
- LL:将最小不平衡子树的根的左孩子右旋
- RR:将最小不平衡子树的根的右孩子左旋
- LR:将最小不平衡子树的根的左孩子的右孩子先左旋再右旋
- RL:将最小不平衡子树的根的右孩子的左孩子先右旋再左旋
for instance
RR型的调整
插入90,出现RR型不平衡,自下而上找到最小不平衡子树以66为根
针对66的右孩子进行左旋操作
调整结束
RL型的调整
插入63,出现RL型不平衡,自下向上找到最小不平衡子树以50为根
则针对50的右孩子的左孩子:66进行左旋+右旋
调整结束
查找效率分析
6.006的证明方法如下:
N_h表示构成一棵高度为h的AVL树的最少结点数:
第一种方法根据递推式可以粗略得到h的上限,数量级为O(lgn)
第二种根据斐波那契数列可以得到更精确的近似 max.h 约等于1.440lgn,
总之,记住含有n个结点的AVL树的最大深度为O(lgn)即可,这也意味着平衡二叉树的平均查找长度为O(lgn)
Huffman Tree
WPL
带权路径长度
Def.
Build a Huffman tree
哈夫曼树并不唯一 :
哈夫曼编码
用一串二进制数表示信息
Optimize_Attempt1
固定长度 → 可变长
降低了树的 WPL
Optimize_Attempt2
Q:能否进一步减少编码长度,将A直接用1表示?
A:这会导致接收方解码时出现歧义
(右图树画错了,应该有三层)