第十六章

Download Report

Transcript 第十六章

第16章
树
树是一类结构较为简单的图,用途极为广泛。
特别是二叉树。
学习时应很好的掌握一些概念和算法,诸如,
树的充要条件,树的各种算法等等。
1
学习要点
 无向树及生成树
无向树的定义 (包括等价定义)
无向树的性质
 生成树
定义,由连通图构造最小生成树的克鲁斯克尔算法。
 根树及其应用
有向树及根树的定义,
家族树,有序树,r叉树的概念
最优二叉树的概念和哈夫曼算法,二叉树周游
本章中所谈回路均指简单回路或初级回路
2
第十六章:树
第一节:无向树及其性质
3
无向树的定义
无向树 ——连通且不含回路的无向图。
无向树简称树,常用 T 表示。
平凡树 ——平凡图。
森林
——连通分支数大于等于2,且每个连通
分支都是树的无向图。
树叶 — —度数为1的顶点
树T的顶点 
分支点 — —度数大于1的顶点
4
例题
判断下面的图,是树,森林,还是平凡树?
a
b
c
e
(1)
d
f
(2)
(4)
(3)
5
树的等价定义
定理:设 G  V , E , V  n , E  m ,
则以下命题等价:
(1) G是连通且不含回路,即G是树
(2) G中每一对顶点间有且仅有一条路径。
(3) G无回路且m=n-1
(4) G连通且m=n-1
(5) G连通,且G中任何边均为桥。
(6) G无回路,但增加一边后得到且仅得一个圈
6
树的性质
(1) 树中顶点数与边数的关系:n
 m 1 。
(2) 非平凡树至少2片树叶。
证明: 设
T  V, E
为
设 T 有 k 片树叶,则有
n 阶非平凡树,
(n  k ) 个顶点度数大于等
n
于2, 由握手定理,
2m   d (vi )  k  2(n  k )
i 1
又由(1)
m  n  1 ,代入上式,解得 k  2 ,
即 T 至少2片叶。
7
例题
画出所有的6个顶点的非同构的树。
解:所要画的树有6个顶点,则边数为5,因此
6个顶点的度数之和为10,可以产生以下五种
度数序列:
(1)
1 1 1 1 1 5
T1
8
(3) 1 1 1 1 3 3
(2) 1 1 1 1 2 4
T2
T3
(4) 1 1 1 2 2 3
T4
(5) 1 1 2 2 2 2
T5
T6
9
例题
一棵树有7片叶,3个3度顶点,其余都
是4度顶点,求4度顶点多少个?
解:设有
边数
x 个4度顶点,则顶点数 7  3  x
7  3  x 1 ,
由握手定理,
解得
,
4 x  3  3  7  2(7  3  x  1) ,
x 1 ,
故这棵树有1个4度顶点。
10
例题
已知无向树T中有1个3度顶点,2个2度顶点,其余顶点全是
树叶,试求树叶数,并画出满足要求的非同构的无向树.
解 解本题用树的性质m=n1,握手定理.
设有x片树叶,于是 n = 1+2+x = 3+x,
2m = 2(n1) = 2(2+x) = 13+22+x
解出x = 3,故T有3片树叶.
T 的度数列应为 1, 1, 1, 2, 2, 3,
易知3度顶点与1个2度顶点相邻
与和2个2度顶点均相邻是非同
构的,因而有2棵非同构的无向
树T1, T2,如图所示.
11
例题
已知无向树T有5片树叶,2度与3度顶点各1个,其余顶点的
度数均为4,求T的阶数n,并画出满足要求的所有非同构的
无向树.
解 设T的阶数为n, 则边数为n1,4度顶点的个数为n7.
由握手定理得
2m = 2(n1) = 51+21+31+4(n7)
解出n = 8,4度顶点为1个.
12
例题
T的度数列为1, 1, 1, 1, 1, 2, 3, 4,共有3棵非同构的无向树,
如图所示.
13
例题
无向树 T 有ni个i 度顶点,i=2, 3, …,k,其余顶点全是树叶,
求T 的树叶数.
解 用树的性质:边数 m=n1(n为阶数),及握手定理.
k
(1)
n   ni  t
t为树叶数
i2
k
(2)
m   ni  t  1
i 2
(3)
k
n
k
i 2
i 1
i 2
2 m  2 ni  2t  2   d ( vi )   i ni  t
k
从而解出 t   ( i  2)ni  2
i3
14
第十六章:树
第二节:生成树
15
生成树的定义
1、定义:设
G  V, E
是无向连通图, T 是
的生成子图,若 T 是树,称 T 是
树枝 ——
G在 T 中的边,
弦
G 不在 T 中的边,
——
余树 ——
G
G 的生成树。
T 的所有的弦的集合的导出子图。
16
例题
(1)
(2)
上图中,(2)是(1)的生成树,
(3)
(3)是(2)的余树。
注意: (1) 生成树不唯一,
(2) 余树不一定是树。
17
生成树存在条件
定理:无向图G具有生成树当且仅当G是连通图
证明:
必要性 显然
充分性,如果G无回路,则G本身就是它的生成树,如
G有回路,则在回路上任取一条边并去掉后仍是连通
的,如G仍有回路,则继续在该回路上去掉一条边,直
到图中无回路为止,此时该图就是G的一棵生成树
已知连通图G ,求其生成树步骤。
18
生成树的性质
设
G  V, E
为连通图,
(1)
G至少有一棵生成树,
(2)
m  n 1,
(3) 设 T 是
G 的生成树,
则 T '中有
(4) 设 T 是
V  n, E  m ,
T ' 是 T 的余树,
m  n  1 条边。
G 的生成树,
T ' 是 T 的余树,
C为G中任意一个圈,则E(T’) ∩E(C)不为空。
19
基本回路的存在
定理16.4 设T为G的生成树,e为T的任意一条弦,则Te中
含一个只有一条弦其余边均为T的树枝的圈. 不同的弦对应的
圈也不同.
证 设e=(u,v),在T中u到v有惟一路径 ,则 e为所求的圈.
20
基本回路系统
定义16.3 设T是n阶m条边的无向连通图G的一棵生成树,设
e1, e2, …, emn+1为T 的弦. 设Cr为T 添加弦er 产生的只含弦
er、其余边均为树枝的圈. 称Cr为G的对应树T 的弦er的基本
回路或基本圈,r=1, 2, …, mn+1. 并称{C1, C2, …,Cmn+1}为
G对应T 的基本回路系统,称mn+1为G的圈秩,记作 (G).
求基本回路的算法:设弦e=(u,v),先求T中u到v的路径uv,
再并上弦e,即得对应e的基本回路.
21
基本割集的存在
定理16.5 设T是连通图G的一棵生成树,e为T的树枝,则G
中存在只含树枝e,其余边都是弦的割集,且不同的树枝对
应的割集也不同.
证 由定理16.1可知,e是T的桥,因而Te有两个连通分支T1
和T2,令
Se={e’ | e’E(G)且 e’ 的两个端点分别属于V(T1)和V(T2)},
由构造显然可知Se为G的割集,eSe且Se中除e外都是弦,
所以Se为所求. 显然不同的树枝对应的割集不同.
22
基本割集与基本割集系统
定义16.4 设T是n阶连通图G的一棵生成树,e1, e2, …, en1
为T 的树枝,Si是G的只含树枝ei的割集,则称Si为G的对应
于生成树T由树枝ei生成的基本割集,i=1, 2, …, n1. 并称
{S1,S2, …, Sn1}为G 对应T 的基本割集系统,称n1为G的割
集秩,记作(G).
求基本割集的算法:
设e为生成树T 的树枝,Te为两棵小树T1与T2,令
Se ={e | eE(G)且e的两个端点分别属于T1与T2}
则Se为e 对应的基本割集.
23
例题
下实线边所示为生成树,求基本回路系统与基本割集系统
解 弦e, f, g对应的基本回路分别为
Ce=e b c, Cf=f a b c, Cg=g a b c d, C={Ce, Cf, Cg}.
树枝a, b, c, d对应的基本割集分别为
Sa={a, f, g}, Sb={b, e, f, g}, Sc={c, e, f g}, Sd={d, g},
S={Sa, Sb, Sc, Sd}.
24
最小生成树
对于有向图或无向图
G 的每条边附加一个实数
w(e) ,则称 w(e) 为边 e 上的权, G 连同附加在
各边上的实数称为带权图,记为
定义:设无向连通带权图
G  V , E, W
G  V , E, W
G 的一棵生成树, T 各边带权之和称为
,
。
T是
T 的权,
记作 W (T ) 。
最小生成树
—— 各边权和最小的生成树。
25
Kruskal 避圈法
设 n 阶无向连通带权图G  V , E,W 中有 m 条
边 e1 , e2 ,
, em ,它们带的权分别为 a1 , a2 ,
不妨设 a1  a2 
, am ,
 am ,
(1) 取 e1 在 T 中 (非环,若 e1为环,则弃 e1 )。
(2) 若e2 不与在 T 中的边构成回路,取 e2 在T 中,否则弃
e2 ,再查 e3 ,继续这一过程,直到形成树为止。
26
例题
求图的一棵最小生成树.
所求最小生成树如
图所示,W(T)=38.
27
例题
求以下连通图的最小生成树 T 及 W (T ) 。
a
a
解:
5
5
1
1
e
e
5
5
5
b
b
f
f
2
3 6
3
4 2
4
c
6
(1)
d
c
d
T1
W (T1 )  15
28
a
5
b
3
1
e
5
f
6
c
解:
5
5
2
4
6
(1)
d
a
5
1
e
b
f
3
2
4
c
d
T1 '
W (T1 ')  15  W (T )
29
例题
求以下连通图的最小生成树 T 及
a
6 b
f
9
2
3
c
b
5
7
1
f
2
3
8
10
4
a
解:
7
1
W (T ) 。
e 7
c
5
d
d
(2)
e
T2 W (T2 )  18
30
G 的最小生成树可能不唯一,
解: 1
b
3
c
a
但
G 的不同最小生成树权的值一样。
f
2
7
5
e
d
T2 '
W (T2 ')  18  W (T )
31
例题
 设有6个城市v1,v2,…,v6,它们之间有输油管连通
,其布置如图所示,Si(数字)中Si为边的编号,括
号内数字为边的权,它是两城市间的距离,为了保卫
油管不受破坏,在每段油管间派一连士兵看守,为保
证每个城市石油的正常供应最少需多少连士兵看守?
输油管道总长度越短,士兵越好防守。求他们看守管
道的最短的总长度。
32
区别
Kruskal算法
Dijkstra算法
目的
构造最小生成树
构造单源最短路径
图类型
无向连通图
无向/有向连通图
起始点
任选一个起点
有一个确定的起点(源
点),其余为终点
连通顶点
连通所有顶点,且总
造价最低
源点到各终点的两顶
点间的最短路
构成结果图
所构成的连通图的权
值之和最小
一定是源点到终点的
两路径权值最短
33
第十六章:树
第三节:根树及其应用
34
根树的定义
定义16.6 T是有向树(基图为无向树)
(1) T 为根树——T 中一个顶点入度为0,其余的入度均为1.
(2) 树根——入度为0的顶点
(3) 树叶——入度为1,出度为0的顶点
(4) 内点——入度为1,出度不为0的顶点
(5) 分支点——树根与内点的总称
(6) 顶点v的层数——从树根到v的通路长度
(7) 树高——T 中层数最大顶点的层数
(8) 平凡根树——平凡图
35
根树的定义
树叶(入度为1,出度为0)
树根(入度为0)
根树的顶点
分支点
内点(入度为1,
出度大于0)
36
根树实例
根树的画法——树根放上方,省去所有有向边上的箭头
37
例
v1
v1
v2
v2
v4
v4
v3
v3
v7
v5
v8
v6
v9
v12
v10
v11
v13
v7
v5
v8
v6
v9
v12
v10
v11
v13
图中v1是树根, v2, v4, v7, v10是内点, v3, v5, v6, v8, v9, v11,
v12 , v13是树叶。
习惯把有向树的根画在最上方,边的箭头全指向下,则可以省略全
部箭头。上图树高为4。
38
练习
画出基图为图所示无向树的所有非同构的根树
以a, b, c 或d为根的根树同构,选a为根,则根
树如图(1); 以 e 与 g 为根的根树同构,取 g为
根,则根树如图(2); 以 f 为根,如图(3) 所示.
(1)
(2)
(3)
39
家族树
定义16.7 T 为非平凡根树
(1) 祖先与后代
(2) 父亲与儿子
(3) 兄弟
定义16.8 设v为根树T中任意一顶点,称v及其后代的导出子
图为以v为根的根子树.
40
实例
v1
v2
v4
v3
v7
v5
v8
v6
v9
v12
v10
v11
图中v1是v2的父亲, v2是v1的
儿子, v2, v5, v6,构成的子
图是T的子树且是真子树。
v1是v5的祖先,v5是v1的后代,
v1有3个儿子分别是
v2, v3, v4,它们互为兄弟。
v13
41
根树的分类
(1) T 为有序根树——同层上顶点标定次序的根树
(2) 分类
① r 叉树——每个分支点至多有r 个儿子
② r 叉有序树——r 树是有序的
③ r 叉正则树——每个分支点恰有r 个儿子
④ r 叉正则有序树
⑤ r 叉完全正则树——树叶层数相同的r叉正则树
⑥ r 叉完全正则有序树
42
实例
1
1
2
1
1
2
1
2
(1)
2叉有序树
1
2
(2)
1
2
2
1
2 1
2
(3)
2叉有序正则树 2叉有序完全正则树
43
最优二叉树
定义16.9 设2叉树T 有t片树叶v1, v2, …, vt,权分别为w1, w2,
t
…, wt,称 W (t )   wi l (vi ) 为T 的权,其中l(vi)是vi 的层数.
i 1
在所有有t片树叶,带权w1, w2, …, wt 的2叉树中,权最小的2
叉树称为最优2叉树.
求最优树的算法—— Huffman算法
给定实数w1, w2, …, wt,且w1w2…wt.
(1) 连接权为w1, w2的两片树叶,得一个分支点,其权为w1+w2.
(2) 在w1+w2, w3, …, wt 中选出两个最小的权,连接它们对应的
顶点(不一定是树叶),得新分支点及所带的权.
(3) 重复(2),直到形成 t1个分支点,t片树叶为止.
44
例题
下图中的树 都是带权1,3,4,5,6 的2叉树
求
W (T1 ) ,W (T2 ) 。
T2
T1
3
4
4
6
3
5
1
5
1
6
解:W (T1 )  (6  3)  3  (4  5  1)  2  47
W (T2 )  (1  6)  4  5  3  4  2  31  5445
例题
例 求带权为1, 1, 2, 3, 4, 5的最优树.
解题过程由图9给出,W(T)=38
46
例题
求带权1,3,4,5,6的最优2叉树 T 及W (T ) 。
19
解:
其实 W (T ) 等于T 的
8
4
11
4
5
各分支点的权之和,即
6
W (T )  4  8  11  19
 42
1
3
W (T )  (1  3)  3  (4  5  6)  2  42
最优树是不唯一的,但 Huffman 算法得到的树
一定是最优树。
47
例题
求带权为2,3,5,7,8,9的最优2叉树T
34
解:
4
(3)h(T )  ____
19
9 7
10
5
15
5
(4)T 有___片树叶。
6
8
(5)T 有__个2度顶点,
1
4
__个3度顶点,
0
__个4度顶点。
2
3
5  10  19  15  34  83
(2)W (T )  ____________________
48
最佳前缀码
最优2叉树的用途之一是求最佳前缀码。
在通讯中,我们常用0和1的符号串作为英文字母的传送信
息,26个英文字母被使用的频率往往是不同的。为了使整
个信息的长度尽可能短,自然希望用较短的符号串去表示
使用频率高的英文字母,用较长的符号串表示使用频率低
的英文字母。
为了使编码在使用中既快速又准确,可以用求最优2元树的
Huffman算法解决这个问题。
49
前缀码
定义16.10 设12…n-1n是长度为 n 的符号串
(1) 前缀——1, 12, …, 12…n1
(2) 前缀码——{1, 2, …, m}中任何两个元素互不为前缀
(3) 二元前缀码——i (i=1, 2, …, m) 中只出现两个符号,如0
与1.
那么:{00, 01, 100, 1010, 1011, 11111}
{ abc, cba, bca, bac, acb, cab }
{1, 00, 011, 01001, 01000 }
是前缀码吗?
50
50
前缀码
如:{ 0, 10, 110, 1111}
{1, 01, 001, 0001 }等是(二元)前缀码
而 { 1,11,101,001,0011 }
不是(二元)前缀码
如何产生
二元前缀
码呢?
51
生成二元前缀码的方法
给定一棵2叉树T,设它有t片树叶。设v为T的一个分支点,
则v至少有一个儿子,最多有两个儿子。若v有两个儿子,
在由v引出的两条边上,左边的标上0,右边的标上1;若v
有一个儿子,在由v引出的边上可标上0,也可标上1。设
vi为T的任一片树叶,从树根到vi的通路上各边的标号组
成的0,1串组成的符号串放在vi处,t片树叶处的t个符号
串组成的集合为一个二元前缀码
由上面做法知,vi处的符号串的前缀均在vi所在的通路
上除vi外的顶点处达到,因而所得符号串集合为二元前
缀码。T为正则2叉树, 则由T产生的前缀码唯一
52
图所示二叉树产生的前缀码为
{ 00, 10, 11, 011, 0100, 0101 }
53
最佳前缀码
把各字符看作为树叶, 各字符出现的频率作为其相应的
权, 利用Huffman算法求出最优2叉树, 由此产生的前缀
码即为最佳前缀码
在通信中,八进制数字出现的频率如下:
0:25%
1:20%
2:15%
3:10%
4:10%
5:10%
6:5%
7:5%
求传输它们的最佳前缀码,并求传输10n(n2)个按上述
比例出现的八进制数字需要多少个二进制数字?若用等长
的(长为3)的码字传输需要多少个二进制数字?
54
求最佳前缀码
解 用100个八进制数字中各数字出现的个数,即以100乘各频
率为权,并将各权由小到大排列,得w1=5, w2=5, w3=10, w4=10,
w5=10, w6=15, w7=20, w8=25.
01-----0
11-----1
001-----2
100-----3
101-----4
0001-----5
00000-----6 00001-----7
W(T)=285,传
10n(n2)个用二进制
数字需2.8510n个,
用等长码需310n个
数字.
55
波兰符号法与逆波兰符号法
行遍或周游根树T——对T的每个顶点访问且仅访问一次.
对2叉有序正则树的周游方式:
① 中序行遍法——次序为:左子树、根、右子树
② 前序行遍法——次序为:根、左子树、右子树
③ 后序行遍法——次序为:左子树、右子树、根
对图所示根树按中序、前序、
后序行遍法访问结果分别为:
b a (f d g) c e,
a b (c (d f g) e),
b ((f g d) e c) a
56
用2叉有序正则树存放算式
存放规则
 最高层次运算放在树根
 后依次将运算符放在根
子树的根上
 数放在树叶上
 规定:被除数、被减数
放在左子树树叶上
算式 ((b+(c+d))a)((ef)(g+h)(ij))
存放在图所示2叉树上.
57
波兰符号法
波兰符号法
按前序行遍法访问存放算式的2叉有序正则树,其结果不加
括号,规定从右到左每个运算符号与其后面紧邻两个数进行
运算,运算结果正确. 称此算法为波兰符号法或前缀符号
法. 对上图的
访问结果为
b+cdaef+ghij
逆波兰符号法
按后序行遍法访问,规定从左到右每个运算符与前面紧邻两
数运算,称为逆波兰符号法或后缀符号法. 对上图的访问
结果为
bcd++aefgh+ij
58