有向图的最小树形图解剖
图论课件-有向图
例3 求下图D的强连通分支、单向连通分支。
2
3
4
5
1
9
8
7
6
D
14
1
0.5 n 0
0.5
1 2 1.5 t1
0.5
00
1 0.8
0.6 0.4 x 0.2
(1) D的强连通分支
2
3
4
5
{1} {2, 3, 9, 8, 4, 7} {5} {6}
1
9
8
7
6
D
上面点集导出的子图是 D的强 连通分支。
2
证明:“必要性”
设V(D)={v1,v2,…,vn}。由于D是强连通图,所以,对任 意两点vi与vj, 都存在(vi, vj)路,同时也存在(vj ,vi)路。所以 存在如下闭途径:v1→v2→…→vn→v1。这是一条包含D的 所有顶点的回路。
12
1
0.5 n 0
0.5
1 2 1.5 t1
0.5
00
1
0.5 n 0
0.5
1 2 1.5 t1
0.5
00
1 0.8
0.6 0.4 x 0.2
(2) 在L中取v7, U中取点v6 , 作边<v7, v6>。令l (v6)=l (v7)+1=3, L ={v1,v7,v6}, U={v2,v3,…,v5}, A={ <v1, v7>, <v7, v6> }
6
1
0.5 n 0
0.5
1 2 1.5 t1
0.5
00
1 0.8
0.6 0.4 x 0.2
对 v V (D) ,有
d (v) d (v) 1
最小生成树的构造离散数学
最小生成树的构造离散数学
最小生成树的构造是离散数学技术的重要组成部分,用于解决图形中的最小树问题。
能够有效地构造最小生成树,有助于我们解决复杂的网络优化等问题。
最小生成树是指一个边数最少的连接结点的树,即所有点之间只建立最少的边,使得所有点都连接在一起,称为一棵生成树。
最小生成树建立在图上,是多重图G(V,E)的一棵子树,它满足以下三个条件:1、包含G中的所有n个结点;2、只包含G中m-n+1条边;3、权值最小。
使用最小生成树的边,可以把n个节点连接成一个树,所有边的权重总和最小。
最小生成树的步骤是:1、选择一个结点作为树的根,将它加入到树中;2、以选定的结点为根,从剩余结点中选择权值最小的边,加入到树中;3、继续重复步骤2,直到n-1条边全部加入到树中,从而完成树的构造。
最小生成树有多种构造方式,如Prim和Kruskal算法、动态规划算法等,可以快速和有效地构建最小生成树。
Prim算法从图中原始结点出发,每一步都把一条最短边加入进去;Kruskal算法从图中原始边出发,每次都把一条最短边加入进去;动态规划算法是在Graph-MST网络上使用的,可以用来解决复杂的路径优化等问题。
总之,最小生成树的构造是离散数学的重要技术,能够有效地构建最小生成树,从而解决复杂的网络优化问题。
最小生成树的构造有不同的方法,要想更好地理解和使用,就需要深刻掌握其原理和实现方法。
图最小生成树
是按逐个将顶点连通的方式来构造最
小生成树的。
10
从连通网络 N = { V, E }中的某一顶点 u0 出 发,选择与它关联的具有最小权值的边( u0, v), 将其顶点加入到生成树的顶点集合U中。 以后每一步从一个顶点在 U 中,而另一个顶点不 在U中的各条边中选择权值最小的边(u, v),把该 边加入到生成树的边集TE中,把它的顶点加入到 集合 U 中。如此重复执行,直到网络中的所有顶 点都加入到生成树顶点集合U中为止。
for (i=0; i<G.vexnum; ++i)
// 建零入度顶点栈S
if (!indegree[i]) Push(S, i); // 入度为0者进栈 count = 0; // 对输出顶点计数
while (!StackEmpty(S)) { Pop(S, i); printf(i, G.vertices[i].data); ++count; // 输出i号顶点并计数 for (p=G.vertices[i].firstarc; p; p=p->nextarc) { k = p->adjvex; // 对i号顶点的每个邻接点的入度减1
23
由于AOV网中有些活动之间没有次序要求,它们在拓扑序列的 位置可以是任意的,因此拓扑排序的结果不唯一。
C1 C3 C4
对右图进行拓扑排序,可得一个拓扑序列: C1,C3,C2,C4,C7,C6,C5 也可得到另一个拓扑序列: C2,C7,C1,C3,C4,C5,C6
C7 C2
C6 C5
还可以得到其它的拓扑序列。学生按照任何一个拓扑序列都可 以完成所要求的全部课程学习。 在AOV网中不应该出现有向环。因为环的存在意味着某项活动 将以自己为先决条件,显然无法形成拓扑序列。 判定网中是否存在环的方法:对有向图构造其顶点的拓扑有序 序列,若网中所有顶点都出现在它的拓扑有序序列中,则该 AOV网中一定不存在环。
最小生成树解法
最小生成树解法
最小生成树(Minimum Spanning Tree, MST)是指一棵图的生成树,其所有边的权值之和最小。
在计算最小生成树问题时,切图算法(Prim)和克鲁斯卡尔算法(Kruskal)是两种常用的解法。
切图算法从一个源点开始,依次将与源点相连的边加入树中,同
时将与该边相连的节点加入集合,然后在新集合中选取一条连接已选
节点和未选节点的最短边加入树,并将新的节点也加入集合中。
直至
所有节点都被加入树中。
克鲁斯卡尔算法则是将边按照权值从小到大排序,依次取边加入
树中,在加入前需判断该边是否会形成环,若不会则加入树中,并将
该边的两个节点视为已连接。
直至所有节点都被加入树中。
两种算法时间复杂度均为O(ElogE),其中E为边数。
但Prim算法更适合求解稠密图,而Kruskal算法则比较适合求解稀疏图。
最小树与最小树形图(数学建模)讲解
最小树与最小树形图(数学建模)讲解一、最小树的定义及性质1. 定义:最小树,又称最小树,是指在给定的带权无向图中,包含图中所有顶点的一个树形结构,且树中所有边的权值之和最小。
2. 性质:(1)最小树中不存在回路;(2)对于最小树中的任意两个顶点,它们之间有且仅有一条路径;(3)最小树中边的数量等于顶点数量减一;(4)在最小树中添加任意一条边,都会形成一条回路;(5)最小树不唯一,但权值之和相同。
二、求解最小树的方法1. Prim算法Prim算法是一种贪心算法,其基本思想是从图中的一个顶点开始,逐步添加边和顶点,直到形成最小树。
具体步骤如下:(1)初始化:选择一个顶点作为最小树的起点,将其加入最小树集合;(2)迭代:在最小树集合和非最小树集合之间,寻找一条权值最小的边,将其加入最小树集合;(3)重复步骤2,直到所有顶点都加入最小树集合。
2. Kruskal算法Kruskal算法同样是一种贪心算法,其基本思想是将图中的所有边按权值从小到大排序,然后依次选择权值最小的边,判断是否形成回路,若不形成回路,则将其加入最小树集合。
具体步骤如下:(1)初始化:将所有顶点视为独立的树;(2)按权值从小到大排序所有边;(3)迭代:选择权值最小的边,判断其是否形成回路,若不形成回路,则将其加入最小树集合;(4)重复步骤3,直到所有顶点都在同一棵树中。
三、最小树形图的定义及求解方法1. 定义:最小树形图,又称最优树形图,是指在给定的有向图中,找到一个包含所有顶点的树形结构,使得树中所有边的权值之和最小。
2. 求解方法:朱刘算法(Edmonds' Algorithm)朱刘算法是一种用于求解最小树形图的算法,其基本思想是通过寻找图中的最小权值环,进行收缩和扩展操作,最终得到最小树形图。
具体步骤如下:(1)寻找最小权值环;(2)对最小权值环进行收缩操作,将环中的顶点合并为一个新顶点;(3)在新图中寻找最小树形图;(4)将新图中的最小树形图扩展回原图,得到原图的最小树形图。
最小生成树问题(共7张PPT)
个,所以支撑树是有不唯一]。
C n1 m
求最小树的Kruskal算法
赋权的连通图G=(V,E)中m=|E|,n=|V|,
S1:对E中各边的权排序,设 w1≤w2≤…≤wm,wi=w(ei)
S2:初始化: w←0,T←φ,k←1,t←0
S3:若t=n-1则转S6,否则转S4
Y
N
T’←T∪{ek}
T’成圈? N END
Y
T←T+ {ek},
k←k+1 w←w+wk,
t←t+1,k←k+1
用Kruskal算法求最小树
用Kruskal算法(避圈法)求赋权连通图G的最小树
V2
5
V6
Kruskal法盯住边,而Prim法更注意顶点:
T为最小树,w为T的权。
4
T={v1,v2,v3,v5}
Prim法求最小支撑树 E的权排序w1≤w2≤…≤wm w←0,T←φ,k←1,t←0
对要m让条程边序的读边懂长“图排”,序S程3,:序m如个何元判素断排是序否较成好“的圈算”?法谈是何基容于易分,治时策间略、的空快间速复排杂序性(Q绝u不ick应S小or看ting),其时间复杂性是O(m㏒m)。
min S2:初始化:w←0,T←φ,k←1,t←0 设: {w(vv )}w(vv ) 简对称m条最边小的树边或长最排短序树,[管vvm线ij个 铺ST 元设素]。排序较好的i算法j是基于分治策略的快l速排k序(Quick Sorting),其时间复杂性是O(m㏒m)。
S4:若T∪{ek}有圈则k←k+1转S4,否则 转S5
S5: T←T∪{ek},w←w+wk, t←t+1, k←k+1,转S3
图论_5_树
• 图——基本概念
– 图、路与连通、最短路、有向图、图的矩阵
• Euler图与Hamilton图 • 树
– 树、生成树、有向树
• 平面图 图的着色
– 平面图、对偶图、顶点着色、面着色
• 网络 匹配 独立集
树
• 树的概念 • 生成树 • 有向树
树
• 定义1 连通无回路的图称为树,树中度为 1的点称为树叶,度大于1的点称为分枝点 或内点,每个连通分支均为树的图称为森 林。
Kruskal算法
(1)选取G的一边e1,使w(e1)=min{w(e)|e∈E},令E1 ={e1} (2)若已选出Ei={e1,…,ei},那么,从E-Ei中 e 选取一边ei+1,使 (Ⅰ)Ei∪{ei+1}的导出子图中不含回路; (Ⅱ)w(ei+1)=min{w(e)|e∈E-Ei , Ei∪{e}的导 出子图无回路} (3)若ei+1存在,令Ei+1=Ei∪{ei+1},i+1→i,转 (2),若ei+1不存在,则停止。
• 定理2 任意一棵非平凡树 T 中,至少有 两片树叶。
• • •
作业 证明 非平凡树中最长路的起点和终点 均为树叶。 证明 一棵树恰有2片树叶,则此树为 路。
生成树
• 定义1 若图G的生成子图T是树,则称T为 G的生成树。
• 定理1 G是连通图当且仅当G有生成树。
• 权图G中带权最小的生成树称为最小生成树 • Kruskal算法 • 输入:简单连通图G ,权函数w 。 • 输出:最小生成树T
(a)
b1
b2
(b)
b3
• 定义4 设u是有根树T的一个顶点,Vu是u 及其子孙构成的顶点集,Vu的导出子图称为 T的以u为根的子树。 • 定
1
详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)1.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树1.1 问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。
这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?1.2 分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
即无向连通图的生成树不是唯一的。
连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n 个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1 条边。
1.3最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:假设N=(V,{ E}) 是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。
1.4 解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。
他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。
时间复杂度O(N^2)假设G=(V,E)为连通图,其中V 为网图中所有顶点的集合,E 为网图中所有带权边的集合。
有向图简介
第7章:有向图很多应用问题涉及有向图。
有向图除了有与(无向)图类似的性质之外,还有一些在图中所不具备的特殊性质。
本章除介绍有向图的基本概念外,着重介绍有向树、有向网络及其应用等问题。
§7.1有向图概述1. 基本概念定义7.1 一个有向图D 是指一个序偶><E V ,,其中V 是一个非空集合,称为D 的点集,其中的元称为D 的顶点。
E 是笛卡儿集V V ⨯的某个多重子集,称为D 的边集,其中的每一个元素均是序偶><v u ,,称为有向边,而u 称为边的始点,v 称为边的终点。
通常记>=<E V D ,,)(D V V =,)(D E E =。
从有向图的定义来看,它与上一章定义的(无向)图是相似的,最关键的区别在于有向边是有方向的,而(无向)边是无方向的。
在(无向)图中, )(v u ,和)(u v ,表示同一条边(不考虑多重边情况),但在有向图中,><v u ,和><u v ,表示的却是两个不同的边,称为对称边,虽然这两条边的端点一样。
对无向图G 的每条无向边指定一个方向,由此得到的有向图D ,称为G 的定向图。
反之,如果把一个有向图D 的每条有向边的方向去掉,由此而得到的无向图G ,称为D 的底图。
把一个有向图D 的每一条有向边反向,由此而得到的有向图称为D 的逆图,记为D ~在有向图中,两个顶点之间若有两条或两条以上的边,并且方向相同,则称为平行边,它强调了边的方向性。
有向图中的其它一些概念,像重数、圈、带圈图、无圈图、多重图、简单图、)(q p ,图、图的阶、平凡图、零图、有限图、无限图、赋权图、邻接、关联、孤立点、孤立边等等,都与(无向)图中相应概念的定义一样,这里不再重复。
在有向图中有如下的度数定义。
定义7.2 设>=<E V D ,是有向图, V v ∈,E 中以v 为起始点的有向边的个数称为v 的出度,记作)(v d +;E 忠以v 为终点的有向边的个数称为v 的入度,记作)(v d -。
【算法】关于图论中的最小生成树(MinimumSpanningTree)详解
【算法】关于图论中的最⼩⽣成树(MinimumSpanningTree)详解什么是图(network)什么是最⼩⽣成树 (minimum spanning tree)最⼩⽣成树的算法这⾥的图当然不是我们⽇常说的图⽚或者地图。
通常情况下,我们把图看成是⼀种由“顶点”和“边”组成的抽象⽹络。
在各个“顶点“间可以由”边“连接起来,使两个顶点间相互关联起来。
图的结构可以描述多种复杂的数据对象,应⽤较为⼴泛,看下图:为了更好地说明问题,下⾯我们看⼀个⽐较⽼套的通信问题:在各⼤城市中建设通信⽹络,如下图所⽰,每个圆圈代表⼀座城市,⽽边上的数字代表了建⽴通信连接的价格。
那么,请问怎样才能以最⼩的价格使各⼤城市能直接或者间接地连接起来呢?我们需要注意两点:最⼩的价格各⼤城市可以是直接或者间接相连的稍稍留⼼可以发现,题⽬的要求是,城市只需要直接或者间接相连,因此,为了节省成本,我们稍稍优化⼀下上述⽅案如下:可以看到,我们砍掉了原先在AD,BE之间的两条道路,建设价格⾃然就降下来了。
当然这个⽅案也是符合我们题⽬的要求的。
按照国际惯例,这⾥要说蛋是了。
上⾯的实例由于数据很简单,优化的⽅案很easy就看出来了。
但在实际中,数据量往往是⾮常庞⼤的。
所以,我们更倾向于设计⼀种⽅法,然后利⽤计算机强⼤的运算能⼒帮我们处理这些数据得出最优的⽅案。
那么,针对上述问题,我们⼀起来看看如何应⽤图的相关知识来实现吧。
为了直观,还是⽤图⽚给⼤家解释⼀下:对于⼀个图⽽⾔,它可以⽣成很多树,如右侧图2,图3就是由图1⽣成的。
从上⾯可以看出⽣成树是将原图的全部顶点以最少的边连通的⼦图,对于有n个顶点的连通图,⽣成树有n-1条边,若边数⼩于此数就不可能将各顶点连通,如果边的数量多于n-1条边,必定会产⽣回路。
对于⼀个带权连通图,⽣成树不同,树中各边上权值总和也不同,权值总和最⼩的⽣成树则称为图的最⼩⽣成树。
基本思想:假设有⼀个⽆向带权图G=(V,E),它的最⼩⽣成树为MinTree=(V,T),其中V为顶点集合,T为边的集合。
最小生成树,拓扑排序,强连通分量总结
h a
f
h
16
Kosaraju算法(双DFS) 实现算法: Tarjan算法 Gabow算法
DFN[i] / LOW[i] LOW[i] = 有未访问出边:min(LOW[i],DFN[nei(i)])
无未访问出边:min(LOW[i],LOW[son(i)])
DFN[i] : 结点i在深搜中的访问顺序
v2
v5
v4 v5 v6
v7
v5 v7 v8 v7 v4 v6 v2 v3 v1
出栈条件: 栈顶结点 的所有邻 接点都已 访问
实质:对每个顶点查找其邻接点
v1 v2 v4 v8 v5 v3
stack
v6 v7
v8
6
大纲
图的基础知识 DFS
基本的图算法
BFS 拓扑排序
强连通分量
最小生成树
7
3.BFS
1 /1
A
2 /2 /1
C
3 /3
E
初始:LOW[i] = DFN[i]
时间复杂度:O(n+e)
B D F
6 /6 /5
stack A C
5 /5 /1
D E F B
4 /4
出栈条件:LOW[i] = DFN[i]
强连通分量:{F}, {E}, {A,C ,D,B}
17
强连通分量是DFS树中的子树。 找到子树的根,从DFS树的最低层开始,求强连通分量。 DFN[i] = LOW[i]就出栈,表示i是强连通分量的根 为什么从DFS树最低层开始?
a
b
c
d
13/14
11 /16
1/10
8/9
12/15 e
3/4 f
最小树形图
一.最小树形图最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小。
最小树形图的第一个算法是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法。
判断是否存在树形图的方法很简单,只需要以v为根作一次图的遍历就可以了,所以下面的算法中不再考虑树形图不存在的情况。
在所有操作开始之前,我们需要把图中所有的自环全都清除。
很明显,自环是不可能在任何一个树形图上的。
只有进行了这步操作,总算法复杂度才真正能保证是O(VE)。
首先为除根之外的每个点选定一条入边,这条入边一定要是所有入边中最小的。
现在所有的最小入边都选择出来了,如果这个入边集不存在有向环的话,我们可以证明这个集合就是该图的最小树形图。
这个证明并不是很难。
如果存在有向环的话,我们就要将这个有向环缩成一个人工顶点,同时改变图中边的权。
假设某点u在该环上,并设这个环中指向u的边权是in[u],那么对于每条从u出发的边(u, i, w),在新图中连接(new, i, w)的边,其中new为新加的人工顶点; 对于每条进入u的边(i, u, w),在新图中建立边(i, new, w-in[u])的边。
为什么入边的权要减去in[u],这个后面会解释,在这里先给出算法的步骤。
然后可以证明,新图中最小树形图的权加上旧图中被收缩的那个环的权和,就是原图中最小树形图的权。
上面结论也不做证明了。
现在依据上面的结论,说明一下为什么出边的权不变,入边的权要减去in [u]。
对于新图中的最小树形图T,设指向人工节点的边为e。
将人工节点展开以后,e指向了一个环。
假设原先e是指向u的,这个时候我们将环上指向u的边 in[u]删除,这样就得到了原图中的一个树形图。
我们会发现,如果新图中e的权w'(e)是原图中e的权w(e)减去in[u]权的话,那么在我们删除掉in[u],并且将e恢复为原图状态的时候,这个树形图的权仍然是新图树形图的权加环的权,而这个权值正是最小树形图的权值。
【转】【最小树形图】有向图的最小生成树【朱刘算法】
【转】【最⼩树形图】有向图的最⼩⽣成树【朱刘算法】这篇⽂章挺好的。
每⾏还有注释QAQ,kuangbin的模板⾥并没有万能节点;万能节点好像是在不定根的时候的拓展。
要点:1.求所有边权和sum;2.以0点为万能节点向所有点建⼀条权值为sum的边;3.记得sum++;保证⽐所有边权值总和⼤⼀点;4.判断条件为(ans==-1 || ans-sum>=sum) //ans-sum是除去虚根的最⼩树形图的最短路径,如果这个距离⽐所有的边权值和sum还⼤,说明还有另外的边由虚点发出,故说明此图不连通5.答案即为ans-sum;做了POJ的⼀道题,总是WA,不知道为什么,后来去看了,才知道,原来有向图的最⼩⽣成树与⽆向图不⼀样,它得是从某个点出发能遍历到其他所有点的才⾏,以此为条件,我们学习到了最⼩树形图。
与很多其他⼈的讲解不⼀样吧,我把我看了博客后⾃⼰的思路分享出来,关于什么是最⼩树形图。
我们知道的既然要建⽴最⼩树形图,就要理解什么是最⼩树形图,(概念好难懂啊,还是⾃⼰写的清楚明⽩),我们从某⼀点出发(或者是固定点),能通过它跑完所有点的最⼩花费,就是最⼩树形图了。
那么,怎么去搭建最⼩树形图?会有⼈看到关于最⼩弧这样的讲法,诶!确实是这样的,但是你们理解什么是最⼩弧吗?我们想构建⼀颗最⼩⽣成树的时候,就是找到这样的最优解的边逐条放进去的(Kruskal算法思想),但是这也是⼀样的,我们找到所有⾮根节点的最⼩⼊边,先把这样的所有⼊边给加进来,那么得到的⼀幅图,可能还真是不完全,要是遇到了个环,岂不是有趣,或者呢,压根就⾛不完!不就GG?所以,就这样就被我们想出了两个需要判断的条件了。
把所有的最⼩⼊边先加起来,我们得到了⼀个花⾥胡哨的图,可能它就是多个环的集合,也许恰好是答案,这都是不确定的,若是恰好是已经没有环了,那么这就是答案了;反之,就是有环,那么,我们得到的边,就不⼀定是所有的点构在⼀起的图(也许会成为森林这样的情况),那么,把环搜索起来吧,我们把⼀个环搜索成⼀个点,然后对于它(新点——即所谓的缩点)的⼊边,我们建⽴新边的时候,需要考虑到我们得删除原来在这幅图⾥的改点的⼊边(就是我们已经存⼊了这个原节点的⼊边了,但是,它却构成了环,说明不是我想要的解),所以,新边的权值就是原权值减去终点节点的最⼩⼊边。
7-8 根树及其应用
例3. 设一组权2,3,5,7,11,13,17, 19,23,29,31,37,41。求相应的最 优树。 解:见P334
图7-8.7 最优二叉树
二叉树的另一个应用,就是前缀码问题。 我们知道,在远距离通讯中,常常用0和 1的字符串作为英文字母传送信息,因为英 文字母共有26个,故用不等长的二进制序 列表示26个英文字母时由于长度为1的序 列有2个,长度为2的二进制序列有22 个, 长度为3的二进制序列有23个,依此类推, 我们有 2+22+23+…+2i≥26 2i+1-2≥26, i≥4
定理7-8.4 设T为带权w1≤w2≤…≤wt的最优 树,若将以带权w1,w2的树叶为儿子的 分枝点改为带权w1+w2的树叶,得到一 棵新树T’,则T’也是最优树。 证明 根据题设,有 w(T)=w(T’)+w1+w2。 若T’不是最优树,则必有另外一棵带权为 w1+w2 ,w3 ,…,wt 的最优树T”。对T” 中带权为w1+w2的树叶vw1+w2生成两个儿 子,得到树 T ,则 w( T )=w(T”)+ w1+w2。
定理7-8.5 任何一棵二叉树的树叶可对应一个前 缀码。 证明 给定一棵二叉树,从每一个分枝点引出两 条边,对左侧边标以0,对右侧边标以1,则每 片树叶可以标定一个0和1的序列,它是由树根 到这片树叶的通路上各边标号所组成的序列, 显然,没有一片树叶的标定序列是另一片树叶 的标定序列的前缀,因此,任何一棵二叉树的 树叶可对应一个前缀码。
定理7-8.6 任何一个前缀码都对应一棵二叉树。 证明 设给定一个前缀码,h表示前缀码中最长序 列的长度。我们画出一棵高度为h的正则二叉 树,并给每一分枝点射出的两条边标以0和1, 这样,每个结点可以标定一个二进制序列,它 是从树根到该结点通路上各边的标号所确定, 因此,对长度不超过h的每一二进制序列必对 应一个结点。对应于前缀码中的每一序列的结 点,给予一个标记,并将标记结点的所有后裔 和射出的边全部删去,这样得到一棵二叉树, 再删去其中未标记的树叶,得到一棵新的二叉 树,它的树叶就对应给定的前缀码。