树与森林的遍历
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1) 用给定的n个权值{w1, w2, …, wn}对应的n个结点构成n 棵二叉树的森林F={T1, T2, …, Tn},其中每一棵二叉树T i(1≤i≤n)都只有一个权值为wi的根结点,其左、右子树为空。
(2) 在森林F中选择两棵根结点权值最小的二叉树,作为 一棵新二叉树的左、右子树,标记新二叉树的根结点权值为其 左右子树的根结点权值之和。
(2) 访问根结点。 例如, 图6.21中树的后根遍历序列为EBHFGCDA。
第十七讲
2. 森林的遍历 森林的遍历方法主要有以下三种: 1) 若森林非空, 则遍历方法为: (1) 访问森林中第一棵树的根结点。 (2) 先序遍历第一棵树的根结点的子树森林。 (3) 先序遍历除去第一棵树之后剩余的树构成的森林。 例如, 图6.24(a)中森林的先序遍历序列为ABCDEFGHIJ。
第十七讲
问题1: 什么样的二叉树的路径长度PL最小? 路径长度为0的结点至多只有1个(根); 路径长度为1的结点至多只有2个; 路径长度为2的结点至多只有4个; 依此类推,路径长度为k的结点至多只有2k个, 所以n个结 点二叉树其路径长度至少等于如下所示序列的前n项之和。
结点路径长度0,1, 1, 2,2,2,2, 3, 3, 3, 3, 3, 3, 3, 3, 4,… 结点数n n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8 … n=15
第十七讲
3. 树的带权路径长度
树的带权路径长度为树中所有叶子结点的带权路径长度 之和,通常记为:
n
WPL Wi 1i
i 1
其中n为叶子结点的个数,wi为第i个叶子结点的权值,li 为第i个叶子结点的路径长度。
例如, 图 6.26中三棵二叉树的带权路径长度分别为:
第十七讲
7
5
2
4
A
B
C
第十七讲
2 34 7 (a) W P L= 2×2+ 2×3+ 2×4+ 2×7= 32
2
3
4
7
(b) W P L= 1×2+ 2×3+ 3×4+ 3×7= 41
7
4
3
2
(c) W P L= 1×7+ 2×4+ 3×3+ 3×2= 7+ 8+ 9+ 6= 30
第十七讲
4. 哈夫曼树 构造哈夫曼算法的步骤如下:
0.1 5
I3
0.0 6
0.0 9
0.0 3
0.0 3 0.0 4
0.0 5
I7
I6
I5
I4
图6.30 构造哈夫曼树示例
第十七讲
表 6 – 3 指令的哈夫曼编码
指令 I1 I2 I3 I4 I5 I6 I7
使用频率(Pi) 0 10
110 11100 11101 11110 11111
第十七讲
可以验证,该编码是前缀编码。若一段程序有1000条指令, 其中I1大约有400条,I2大约有300条,I3大约有150条,I4大约 有50条,I5大约有40条,I6大约有30条,I7大约有30条。对于定 长编码,该段程序的总位数大约为3×1000=3000。采用哈夫 曼 编 码 后 , 该 段 程 序 的 总 位 数 大 约 为 1×400 + 2×300 + 3×150+5×(50+40+30+30)=2200。可见,哈夫曼编码 中虽然大部分编码的长度大于定长编码的长度3, 却使得程序 的总位数变小了。可以算出该哈夫曼编码的平均码长为:
并不是完全二叉树, 但也可以具有最小路径长度,如图所示。
A
A
B
C
B
C
D
E
D
E
(a) P L= 0+ 1+ 1+ 2+ 2= 6
(b) P L= 0+ 1+ 1+ 2+ 2= 6
第十七讲
2. 在实际的应用中,人们常常给树的每个结点赋予一个具 有某种实际意义的实数,我们称该实数为这个结点的权。在 树形结构中,我们把从树根到某一结点的路径长度与该结点 的权的乘积,叫做该结点的带权路径长度。
D
(a) 带权路径长度为36
2
C 4
D
75
A
B
(b) 带权路径长度为46
7
A 5
B 2
4
C
D
(c) 带权路径长度为35
WPL(a)=7×2+5×2+2×2+4×2=36 WPL(b)=4×2+7×3+5×3+2×1=46 WPL(c)=7×1+5×2+2×3+4×3=35
第十七讲
问题2: 什么样的树的带权路径长度最小? 例如: 给定一个权值序列{2, 3, 4, 7}, 可构造如图6.29所 示的多种二叉树的形态。
第十七讲
(3) 从F中删除被选中的那两棵二叉树, 同时把新构 成的二叉树加入到森林F中。
(4) 重复(2)、(3)操作, 直到森林中只含有一棵 二叉树为止, 此时得到的这棵二叉树就是哈夫曼树。
第十七讲
6.5.2 哈夫曼编码
表 6 – 1 指令的使用频率
指令 I1 I2 I3 I4 I5 I6 I7
第十七讲
2) 若森林非空, 则遍历方法为: (1) 中序遍历森林中第一棵树的根结点的子树森林。 (2) 访问第一棵树的根结点。 (3) 中序遍历除去第一棵树之后剩余的树构成的森林。
例如, 图6.24(a)中森林的中序遍历序列为 BCDAFEHJIG。
第十七讲
3) 若森林非空, 则遍历方法为: (1) 后序遍历森林中第一棵树的根结点的子树森林。 (2) 后序遍历除去第一棵树之后剩余的树构成的森林。 (3) 访问第一棵树的根结点。
第十七讲
树与森林的遍历
第十七讲
1. 树的遍历方法主要有以下两种: 1) 若树非空,则遍历方法为: (1) 访问根结点。 (2) 从左到右, 依次先根遍历根结点的每一棵子树。 例如, 图6.21中树的先根遍历序列为ABECFHGD。
第十七讲
2) 若树非空, 则遍历方法为: (1) 从左到右, 依次后根遍历根结点的每一棵子树。
第十七讲
由图6.27可知,结点n对应的路径长度为[log2n],所以前n项 n
之和为 [log 2 k ] 。
k 1
20 0 21 1 22 2 2h h
h
[log 2 k] (h为树的深度),所以完
k 1
全二叉树具有最小路径长度的性质,但不具有唯一性。有些树
第十七讲
作业:
1.二叉树的层次遍历算法(二叉链表存储); 2.求二叉树中最大结点值(二叉链表存储)。
第十七讲 哈夫曼树及其应用
第十七讲
1. 哈夫曼树
1. 路径是指从一个结点到另一个结点之间的分支序列, 路径长度是指从一个结点到另一个结点所经过的分支数目。 树的路径长度是从树根到每一结点的路径长度之和。
使用频率(Pi) 0.40 0.30 0.15 0.05 0.04 0.03 0.03
第十七讲
表 6 – 2 指令的变长编码
指令 I1 I2 I3 I4 I5 I6 I7
使用频率(Pi) 0 1 00 01
000 001 010
第十七讲
1.0 0
0.6 0
0.4 0
0.3 0
I1
0.3 0
I2
0.1ห้องสมุดไป่ตู้5
(2) 在森林F中选择两棵根结点权值最小的二叉树,作为 一棵新二叉树的左、右子树,标记新二叉树的根结点权值为其 左右子树的根结点权值之和。
(2) 访问根结点。 例如, 图6.21中树的后根遍历序列为EBHFGCDA。
第十七讲
2. 森林的遍历 森林的遍历方法主要有以下三种: 1) 若森林非空, 则遍历方法为: (1) 访问森林中第一棵树的根结点。 (2) 先序遍历第一棵树的根结点的子树森林。 (3) 先序遍历除去第一棵树之后剩余的树构成的森林。 例如, 图6.24(a)中森林的先序遍历序列为ABCDEFGHIJ。
第十七讲
问题1: 什么样的二叉树的路径长度PL最小? 路径长度为0的结点至多只有1个(根); 路径长度为1的结点至多只有2个; 路径长度为2的结点至多只有4个; 依此类推,路径长度为k的结点至多只有2k个, 所以n个结 点二叉树其路径长度至少等于如下所示序列的前n项之和。
结点路径长度0,1, 1, 2,2,2,2, 3, 3, 3, 3, 3, 3, 3, 3, 4,… 结点数n n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8 … n=15
第十七讲
3. 树的带权路径长度
树的带权路径长度为树中所有叶子结点的带权路径长度 之和,通常记为:
n
WPL Wi 1i
i 1
其中n为叶子结点的个数,wi为第i个叶子结点的权值,li 为第i个叶子结点的路径长度。
例如, 图 6.26中三棵二叉树的带权路径长度分别为:
第十七讲
7
5
2
4
A
B
C
第十七讲
2 34 7 (a) W P L= 2×2+ 2×3+ 2×4+ 2×7= 32
2
3
4
7
(b) W P L= 1×2+ 2×3+ 3×4+ 3×7= 41
7
4
3
2
(c) W P L= 1×7+ 2×4+ 3×3+ 3×2= 7+ 8+ 9+ 6= 30
第十七讲
4. 哈夫曼树 构造哈夫曼算法的步骤如下:
0.1 5
I3
0.0 6
0.0 9
0.0 3
0.0 3 0.0 4
0.0 5
I7
I6
I5
I4
图6.30 构造哈夫曼树示例
第十七讲
表 6 – 3 指令的哈夫曼编码
指令 I1 I2 I3 I4 I5 I6 I7
使用频率(Pi) 0 10
110 11100 11101 11110 11111
第十七讲
可以验证,该编码是前缀编码。若一段程序有1000条指令, 其中I1大约有400条,I2大约有300条,I3大约有150条,I4大约 有50条,I5大约有40条,I6大约有30条,I7大约有30条。对于定 长编码,该段程序的总位数大约为3×1000=3000。采用哈夫 曼 编 码 后 , 该 段 程 序 的 总 位 数 大 约 为 1×400 + 2×300 + 3×150+5×(50+40+30+30)=2200。可见,哈夫曼编码 中虽然大部分编码的长度大于定长编码的长度3, 却使得程序 的总位数变小了。可以算出该哈夫曼编码的平均码长为:
并不是完全二叉树, 但也可以具有最小路径长度,如图所示。
A
A
B
C
B
C
D
E
D
E
(a) P L= 0+ 1+ 1+ 2+ 2= 6
(b) P L= 0+ 1+ 1+ 2+ 2= 6
第十七讲
2. 在实际的应用中,人们常常给树的每个结点赋予一个具 有某种实际意义的实数,我们称该实数为这个结点的权。在 树形结构中,我们把从树根到某一结点的路径长度与该结点 的权的乘积,叫做该结点的带权路径长度。
D
(a) 带权路径长度为36
2
C 4
D
75
A
B
(b) 带权路径长度为46
7
A 5
B 2
4
C
D
(c) 带权路径长度为35
WPL(a)=7×2+5×2+2×2+4×2=36 WPL(b)=4×2+7×3+5×3+2×1=46 WPL(c)=7×1+5×2+2×3+4×3=35
第十七讲
问题2: 什么样的树的带权路径长度最小? 例如: 给定一个权值序列{2, 3, 4, 7}, 可构造如图6.29所 示的多种二叉树的形态。
第十七讲
(3) 从F中删除被选中的那两棵二叉树, 同时把新构 成的二叉树加入到森林F中。
(4) 重复(2)、(3)操作, 直到森林中只含有一棵 二叉树为止, 此时得到的这棵二叉树就是哈夫曼树。
第十七讲
6.5.2 哈夫曼编码
表 6 – 1 指令的使用频率
指令 I1 I2 I3 I4 I5 I6 I7
第十七讲
2) 若森林非空, 则遍历方法为: (1) 中序遍历森林中第一棵树的根结点的子树森林。 (2) 访问第一棵树的根结点。 (3) 中序遍历除去第一棵树之后剩余的树构成的森林。
例如, 图6.24(a)中森林的中序遍历序列为 BCDAFEHJIG。
第十七讲
3) 若森林非空, 则遍历方法为: (1) 后序遍历森林中第一棵树的根结点的子树森林。 (2) 后序遍历除去第一棵树之后剩余的树构成的森林。 (3) 访问第一棵树的根结点。
第十七讲
树与森林的遍历
第十七讲
1. 树的遍历方法主要有以下两种: 1) 若树非空,则遍历方法为: (1) 访问根结点。 (2) 从左到右, 依次先根遍历根结点的每一棵子树。 例如, 图6.21中树的先根遍历序列为ABECFHGD。
第十七讲
2) 若树非空, 则遍历方法为: (1) 从左到右, 依次后根遍历根结点的每一棵子树。
第十七讲
由图6.27可知,结点n对应的路径长度为[log2n],所以前n项 n
之和为 [log 2 k ] 。
k 1
20 0 21 1 22 2 2h h
h
[log 2 k] (h为树的深度),所以完
k 1
全二叉树具有最小路径长度的性质,但不具有唯一性。有些树
第十七讲
作业:
1.二叉树的层次遍历算法(二叉链表存储); 2.求二叉树中最大结点值(二叉链表存储)。
第十七讲 哈夫曼树及其应用
第十七讲
1. 哈夫曼树
1. 路径是指从一个结点到另一个结点之间的分支序列, 路径长度是指从一个结点到另一个结点所经过的分支数目。 树的路径长度是从树根到每一结点的路径长度之和。
使用频率(Pi) 0.40 0.30 0.15 0.05 0.04 0.03 0.03
第十七讲
表 6 – 2 指令的变长编码
指令 I1 I2 I3 I4 I5 I6 I7
使用频率(Pi) 0 1 00 01
000 001 010
第十七讲
1.0 0
0.6 0
0.4 0
0.3 0
I1
0.3 0
I2
0.1ห้องสมุดไป่ตู้5