AVL Trees & Huffman Tree

AVL Trees

Def.

image-20210612201016317

新结点的插入可能会破坏平衡:

image-20210612201104374

image-20210612201357577

Rotation

left-heavy & right-heavy

将结点的平衡因子定义为:左子树高 - 右子树高

left-heavy说明平衡因子为1,right-heavy说明平衡因子为-1

下面讨论如何对 最小不平衡子树 进行调整 :

(这里为了确保所讨论的最小平衡子树以 A为根,示例中 BL,BR和 AR均为高 H的子树)

LL

image-20210612202614042

RR

image-20210612203757637

LR

image-20210612204706887

image-20210612204728201

RL

image-20210612205211934

image-20210612205237845

小结

左边重就往右旋

右边重则往左旋

image-20210612205502120

Steps

  1. 具体来说,首先自下向上找到最小的不平衡子树
  2. 然后针对这棵子树,分析不平衡原因是以上四种的哪一个;
  3. 如果为:
    • LL:将最小不平衡子树根的左孩子右旋
    • RR:将最小不平衡子树根的右孩子左旋
    • LR:将最小不平衡子树根的左孩子的右孩子先左旋再右旋
    • RL:将最小不平衡子树根的右孩子的左孩子先右旋再左旋

for instance

RR型的调整

插入90,出现RR型不平衡,自下而上找到最小不平衡子树以66为根

针对66的右孩子进行左旋操作

调整结束

image-20210612212553080

image-20210612212747497

RL型的调整

插入63,出现RL型不平衡,自下向上找到最小不平衡子树以50为根

则针对50的右孩子的左孩子:66进行左旋+右旋

调整结束

image-20210612212040956

image-20210612212310792

查找效率分析

image-20210612213531763

6.006的证明方法如下

N_h表示构成一棵高度为h的AVL树的最少结点数:

第一种方法根据递推式可以粗略得到h的上限,数量级为O(lgn)

第二种根据斐波那契数列可以得到更精确的近似 max.h 约等于1.440lgn,

总之,记住含有n个结点的AVL树的最大深度为O(lgn)即可,这也意味着平衡二叉树的平均查找长度为O(lgn)

image-20210612214350389

Huffman Tree

WPL

带权路径长度

image-20210613145551050

Def.

image-20210613145753821

Build a Huffman tree

image-20210613150204554

哈夫曼树并不唯一 :

image-20210613150320542

哈夫曼编码

用一串二进制数表示信息

image-20210613150828447

Optimize_Attempt1

固定长度 → 可变长

image-20210613151052929

降低了树的 WPL

Optimize_Attempt2

Q:能否进一步减少编码长度,将A直接用1表示?

A:这会导致接收方解码时出现歧义

image-20210613151620542

(右图树画错了,应该有三层)

小结

image-20210613152245997

image-20210613152424134

posted @ 2021-06-13 15:26  盐盐盐の锅  阅读(69)  评论(0编辑  收藏  举报