数据结构树和森林

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

28
(3) 在F 中删去这两棵树,同时将新得到的二叉树 加入 F中。 (4) 重复(2) 和(3) , 直到 F 只含一棵树为止。这棵树 便是赫夫曼树。
29
三、 Huffman编码 • 1、问题的提出
例1:设有4个字符d,i,a,n,出现的频 度分别为7,5,2,4,怎样编码才能使它 们组成的报文在网络中传得最快?
4 46
5 58
6 67
4 66
5 58
6 67
√ (小根堆) (小顶堆) (最小堆)
√ (大根堆) (大顶堆) (最大堆)
6.5.3
一、基本术语
1.路径和路径长度

Huffman树
b d e
a c f g
径: 由一结点到另一结点间的分支所构成。
路径长度:路径上的分支数目。 a→e的路径长度= 2
ki ≤ k2i+1
或者
i=1, 2,… n/2
ki ≥ k2i+1
解释:如果让满足以上条件的元素序列 (k1,k2,…,kn) 顺次排成一棵完全二叉树,则此树的特点是: 树中所有结点的值均大于(或小于)其左右孩子,此树的 根结点(即堆顶)必最大(或最小)。
例:有序列T1=(08, 25, 49, 46, 58, 67)和序列T2=(91, 85, 76, 66, 58, 67, 55),判断它们是否 “堆”? 1 2 25 1 08 49 3 2 85 91 76 3 7 55
21
例:依次读入元素序列(45,24,53,12,90)
则生成二叉排序 树的过程为:
24 12 45 53 90
思考:对二叉排序树进行中序遍历的结果是什么?
22
6.5.2 堆
堆的定义:设有n个元素的序列 k1,k2,…,kn,当且仅 当满足下述关系之一时,称之为堆。 ki ≥ k2i ki ≤ k2i
34
35
对应的哈夫曼编码:

a b c d e f g h
二进制码:

a b c d e f g h
编码
1100 00
频率
0.07 0.19 0.02 0.06 0.32 0.03 0.21 0.10
编码
000 001
频率
0.07 0.19 0.02 0.06 0.32 0.03 0.21 0.10
1
data
parents
2 3 n
结点结构 树结构
2
例1: 双亲表示法
A
B D
H I E F
C G
0 1 2 3 4 5 6 7 8
A B C D E F G H I
-1
0 0 1 1 2 2 3 3
缺点:求结点的孩子时需要遍历整个结构。
3
2、用孩子表示法来存储
将每个结点的孩子排列起来,形成一个带表头 (装父结点)的线性表(n个结点要设立n个链表); 再将n个表头用数组存放起来,这样就形成一个混合 结构。 1 a c b 例如:
39
练习题
• 二、假设用于通信的电文由字符集{a,b,c,d,e,f,g} 中的字母构成。它们在电文中出现的频度分别 为{0.31,0.16,0.10,0.08,0.11,,0.20,0.04}, • 1) 为这7个字母设计哈夫曼编码; • 2)对这7个字母进行等长编码,至少需要几位 二进制数?哈夫曼编码比等长编码使电文总长 压缩多少?
15
森林的遍历
A
E
G
• 先序遍历 B C D F H I 若森林为空,返回; J 访问森林中第一棵树的根结点; 先序遍历第一棵树中根结点的子树森林; 先序遍历除去第一棵树之后剩余的树构成的森林。 • 中序遍历 若森林为空,返回; 中序遍历森林中第一棵树的根结点的子树森林; 访问第一棵树的根结点; 中序遍历除去第一棵树之后剩余的树构成的森林。
2.结点的权及带权路径长度
结点的权:若将树中结点赋给一个有着某种含义的数值,则这
个数值称为该结点的权。 结点的带权路径长度:从根结点到该结点之间的路径长度与该 结点的权的乘积。
25
a b
c
e f g
d
从树根到每一结点的路径长度之和。 3、树的路径长度:
4、树的带权路径长度: 树中所有叶子结点的带权路径长 度之和。 5、赫 夫 曼 树:带权路径长度最小的二叉树。
树的路径长度= 10
26
Weighted Path Length
树的带权路径长度如何计算? WPL =
w kl k
k=1
n
例:计算下面三棵二叉树的带权路径长度。
Huffman树 2 c 7 a 5 2 b c 4 d
7 a
4 d
7 a (b)
5 b
5 b
2 c (c)
4 d
(a)
WPL=36
WPL=46
37
本章小结
双亲表示 孩子表示 孩子兄弟
先序遍历
后序遍历
存储结构 树
遍历
1、定义和性质
顺序结构
2、存储结构 森林
遍历
先 序 遍 历
二叉树
二叉链表
链式结构 三叉链表 先序遍历
3、遍历
中序遍历 后序遍历
中 序 遍 历
霍夫曼树
霍夫曼编码
38
练习题
• 一、设序列{d c b a h e I f g }和{a b c h d I e f g } 分别是一棵二叉树的先序序列和中序序列, 试画出该二叉树。
a
b d e c
2 3 4 5 6 7 b c d e
d
e f g f g h
f
g
h
8
h
4
3、用孩子兄弟表示法来存储
用二叉链表来表示树,但链表中的两个指 针域含义不同。 左指针指向该结点的第一个孩子; 右指针指向该结点的下一个兄弟结点。
firstchild data nextsibling
指向左孩子
J
A A E
G
B
C
D
F
H
I
兄弟相连 长兄为父 孩子靠左 头根为根
11
讨论4:二叉树如何还原为森林? 即B={root, LB, RB} F={T1, T2, …,Tm}
要点:把最右边的子树变为森林,其余右子树变为兄弟
A A B E C C F G H I J B A C E G D F E H I
二叉树
平衡树—— 特点:左右子树深度差 ≤1 排序树—— 特点:“左小右大” 字典树—— 由字符串构成的二叉树排序树 判定树—— 例如,12个球只称3次分出轻重 带权树—— 特点:路径长度带权值 最优树—— 带权路径长度最短的树,又称 Huffman
树,用途之一是通信中的压缩编码。
18
6.5 二叉树的应用
旋转
7
Fra Baidu bibliotek
树转二叉树举例: 方法:加线—抹线—旋转
兄弟相连 a b b c i d 长兄为父 孩子靠左
根结点肯定 没有右孩子!
a
c e
i
d
e f g f
g
h
h
8
讨论2:二叉树怎样还原为树?
要点:把所有右孩子变为兄弟!
a
b b d c c i a
e
f g h
i
d
e
f
g
h
9
讨论3:森林如何转为二叉树?
16
例如:
A
B C E
G
H
A 先序序列: B C D E F G H I J
I
J
D
F
中序序列: C D A F E H J I G B
讨论:若采用“先转换,后遍历”方式,结果是否相同?
A B C F D H I J
17
先序序列:A B C D E F G H I J
E G
中序序列:B C D A F E H J I G 结论:森林的先序和中序遍历在 两种方式下的结果相同。
法1:等长编码。例如用二进制编码来实现。 取 d=00,i=01,a=10,n=11 法2:不等长编码。 例如用Huffman编码来实现 取 d=0; i=10, a=110, n=111
注:若要设计长短不等的编码,则必须是任一字符的编码 都不是另一个字符的编码的前缀。
31
构造Huffman树
例如:
树没有中序遍历(因子树不分左右)
a c d e
b
先序序列: a b c d e 后序序列: b d c e a
14
讨论:若采用“先转换,后遍历”方式,结果是否一样?
a b c d d e a
先序遍历:a b c d e
b c e
中序遍历:b d c e a 后序遍历:d e c b a
结论: 1. 树的先序遍历二法相同; 2. 树的后序遍历相当于对应二叉树的中序遍历; 3. 树没有中序遍历,因为子树无左右之分。
分析书上P147 的算法6.12。
36
小结:哈夫曼树及其应用
1.Huffman算法的思路: ——权值大的结点用短路径,权值小的结点用长路径。 2.构造Huffman树的步骤: 对权值的合并、删除与替换 3. Huffman编码规则: 左“0” 右“1”,是一种前缀 码也称为最小冗余编码、紧致码等等,它是数据压缩 学的基础。
指向右兄弟
5
例如:
a
b c e
d f b e g h
a
c
d f
g
h
6
6.4.2 树和森林与二叉树的转换
讨论1:树如何转为二叉树? 转换步骤: 加线 step1: 将树中同一结点的兄弟相连; step2: 保留结点的最左孩子连线,删除其它孩 子连线; 抹线 step3: 将同一孩子的连线绕左孩子旋转45度角。
(a)
(b)
20
2、构造二叉排序树

根据给定的序列构造相应的二叉排序树的方法如 下 依次读入该序列中的每一元素,按下面三种情况进 行相应处理: (1)若二叉排序树为空,则读入的元素为根结点; (2)若二叉排序树不为空,且读入的元素的值小于根结 点的值,则插入到左子树中; (3)若二叉排序树不为空,且读入的元素的值大于根结 点的值,则插入到右子树中;
6.5.1 二叉排序树 6.5.2 堆
6.5.3 哈夫曼树
19
6.5.1 二叉排序树
1、定义----或是一棵空树;或者是具有如下性质的非空二叉树: (1)左子树的所有结点均小于根的值; (2)右子树的所有结点均大于根的值; (3)它的左右子树也分别为二叉排序树。 练:下列2种图形中,哪个不是二叉排序树 ?
——在权值集合{7,5,2,4}中,总是合并当前值最小的两个权
注:方框表示外结点(叶子,字符对应的权值), 圆框表示内结点(合并后的权值)。
32
对Huffman树进行编码 ——将 Huffman树 与 Huffman编码
0 d 1
挂钩
0
i 0 a
1
1 n
Huffman编码结果:d=0, i=10, a=110, 报文总长度=1×7+2×5+3× (2+4)=35
WPL= 35
27
二、Huffman树的构造
(1) 由给定的 n 个权值{w1, w2, …, wn}构成n棵二叉树的 集合(即森林)F = { T1, T2, …, Tn },其中每棵二叉 树 Ti 中只有一个带权为 wi 的根结点,其左右子树均 空。
(2) 在F 中选取两棵根结点的权值最小的树 做为左右子 树构造一棵新的二叉树,且置新的二叉树的根结点 的权值为其左右子树上根结点的权值之和。
即F={T1, T2, …,Tm} B={root, LB, RB}
方法如下: ① 各森林先各自转为二叉树; ② 依次连到前一个二叉树的右子树上。
(参见教材P138图6.17,两种方法都有转换示意图)
10
森林转二叉树举例:(法二)
A
B C D E G
A F
H
I
B E C F D H I J J G
6.4 树和森林
6.4.1 树和森林的存储方式 6.4.2 树和森林与二叉树的转换 6.4.3 树和森林的遍历
1
6.4.1 树和森林的存储方式
树有三种常用存储方式: ①双亲表示法 ②孩子表示法 ③孩子兄弟表示法
1、用双亲表示法来存储
用一组连续空间来存储树的结点,同时在每个结 点中附设一个指示器,指示其双亲结点在链表中的位 data parents 置。
11110
1110 10 11111
010
011 100 101
01
1101
110
111
Huffman码的WPL=2(0.19+0.32+0.21) + 4(0.07+0.06+0.10) +5(0.02+0.03)
=1.44+0.92+0.25=2.61
二进制码 WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3
G
B
J
D
D
F
H
I J
12
问:树转二叉树的“连线—抹线—旋转” 如 何由计算机自动实现? 答:用“左孩子右兄弟”表示法来存储即可 。 存储的过程就是转换的过程!
6.4.3 树和森林的遍历 遍历
树的遍历
深度遍历(先序、中序、后序) 广度遍历(层次)
• 先序遍历 访问根结点; 依次先序遍历根结点的每棵子树。 • 后序遍历 依次后序遍历根结点的每棵子树; 访问根结点。
n=111
特点:每一码都不是另一码的前缀,绝不会错译! 称为前缀码
最快的编码是哪个? 是非等长的Huffman码!
33
例2:假设用于通信的电文仅由8个字母 {a, b, c, d, e, f, g, h} 构成,它们在电文中出现 的概率分别为{ 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10},试为这8个字母设 计哈夫曼编码。如果用0~7的二进制编码方案 又如何? 解:先将概率放大100倍,以方便构造哈夫曼树。 权值集合 w={7, 19, 2, 6, 32, 3, 21, 10}。
相关文档
最新文档