树与生成树
一、树的定义与性质
1)定义:连通而不含回路的无向图称为无向树,简称树,常用T表示树。
树中度数为1的结点称为树叶;度数大于1的结点称为分支点或内部结点。
每个连通分支都是树的无向图称为森林。
平凡图称为平凡树。
树中没有环和平行边,因此一定是简单图
在任何非平凡树中,都无度数为0的结点。
2)树的性质 :定理 设无向图G = <V,E>,|V| = n,|E| = m,下列各命题是等价的:
G连通而不含回路(即G是树);
G中无回路,且m = n-1;
G是连通的,且m = n-1;
G中无回路,但在G中任二结点之间增加一条新边,就得到惟一的一条基本回路;
G是连通的,但删除G中任一条边后,便不连通;(n≥2)
G中每一对结点之间有惟一一条基本通路。(n≥2)
3)树的特点:在结点给定的无向图中,
树是边数最多的无回路图
树是边数最少的连通图
由此可知,在无向图G = (n, m)中,
若m<n-1,则G是不连通的
若m>n-1,则G必含回路
定理:任意非平凡树T = (n, m) 都至少有两片叶。
分析 利用握手定理和m = n-1即可。
证明 因树T是连通的,从而T中各结点的度数均大于等于1。设T中有k个度数为1的结点(即k片叶),其余的结点度数均大于等于2。
由于树中有m = n-1,于是2(n-1)≥2n-k,因此可得k≥2,这说明T中至少有两片叶。
二、 生成树
1)定义
给定图G = <V, E>,若G的某个生成子图是树,则称之为G的生成树,记为TG。
生成树TG中的边称为树枝;G中不在TG中的边称为弦;TG的所有弦的集合称为生成树的补。
2)最小生成树
定义 设G = <V, E>是连通的带权图,T是G的一棵生成树,T的每个树枝所赋权值之和称为T的权,记为W(T)。G中具有最小权的生成树称为G的最小生成树。
一个无向图的生成树不是惟一的,同样地,一个带权图的最小生成树也不一定是惟一的。
Kruskal算法(避圈法) :1)在G中选取最小权边e1,置i = 1。
(2)当i = n-1时,结束,否则转(3)。
(3)设已选取的边为e1, e2, …, ei,在G中选取不同于e1, e2, …, ei的边ei+1,使{e1, e2, …, ei, ei+1}中无回路且ei+1是满足此条件的最小权边。
(4)置i = i+1,转(2)。
在Kruskal算法的步骤1和3中,若满足条件的最小权边不止一条,则可从中任选一条,这样就会产生不同的最小生成树
根树及其应用
一、根树的定义
(1)一个有向图,若略去所有有向边的方向所得到的无向图是一棵树,则这个有向图称为有向树。
2)一棵非平凡的有向树,如果恰有一个结点的入度为0,其余所有结点的入度均为1,则称之为根树。入度为0的结点称为根;出度为0的结点称为叶;入度为1,出度大于0的结点称为内点;又将内点和根统称为分支点。在根树中,从根到任一结点v的通路长度,称为该结点的层数;称层数相同的结点在同一层上;所有结点的层数中最大的称为根树的高。
家族关系 :
定义 在根树中,若从结点vi到vj可达,则称vi是vj的祖先,vj是vi的后代;又若<vi, vj>是根树中的有向边,则称vi是vj的父亲,vj是vi的儿子;如果两个结点是同一个结点的儿子,则称这两个结点是兄弟。
定义 如果在根树中规定了每一层上结点的次序,这样的根树称为有序树。
一般地,在有序树中同一层中结点的次序为从左至右。有时也可以用边的次序来代替结点的次序。
(4)在根树T中,
若每个分支点至多有m个儿子,则称T为m叉树;
若每个分支点都恰有m个儿子,则称T为完全m叉树;
当m=2时,称为二叉树
二、有序树与二叉树之间的转换
1)任何一棵有序树都可以改写为一棵对应的二叉树。方法如下:
加线:在兄弟结点之间加一连线;
抹线:对任何结点,除了其最左的孩子
外,抹掉该结点原先与其孩子之
间的连线;
旋转:将水平的连线和原有的连线,以
树根结点为轴心,按顺时针方向
粗略地旋转450。
(2)二叉树转换为森林或树
与森林转换成二叉树的步骤相反。
定理 在完全m叉树中,若叶数为t,分支点数为i,则下式成立:
(m-1)×i = t-1
三、最优树与哈夫曼算法
三、最优树与哈夫曼算法
四、编码问题
在计算机及通讯事业中,常用二进制编码来表示符号,称之为码字
等长编码
不等长编码
假设电文由A,B,C,D四个字符组成.它们的编码分别为00,01,10和11.则电文‘ABACCDA’的编码为:00010010101100, 总长为14位.
为减少编码长度,重新设 A,B,C,D四个字符的编码为0,00,1和01.则电文编码为000011010,总长为9位.
设a1a2…an-1an为长度为n的符号串,称其子串a1,a1a2,…, a1a2…an-1分别为a1a2…an-1an的长度为1,2,…,n-1的前缀。
设A = {b1, b2, …, bm}是一个符号串集合,若对任意bi, bj∈A,bi≠bj,bi不是bj的前缀,bj也不是bi的前缀,则称A为前缀码。
{1, 01, 001, 000}是前缀码
{1, 11, 001, 0011}不是前缀码
2)用二叉树产生前缀码
给定一棵二叉树T,假设它有t片树叶。
设v是T任意一个分支点,则v至少有一个儿子至多有两个儿子。若v有两个儿子,则在由v引出的两条边上,左边的标上0,右边的标上1;若v只有一个儿子,在v引出的边上可标0也可标1。设vi为T的任意一片树叶,从树根到vi的通路上各边的标号组成的符号串放在vi处,t片树叶处的t个符号串组成的集合为一个前缀码。vi中的符号串的前缀均在vi所在的通路上,因而所得集合为前缀码。
若T存在带一个儿子的分支点,则由T产生的前缀码不唯一,但T若为完全二叉树,则T产生的前缀码就是唯一的了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210318211552496.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhaV80,size_16,color_FFFFFF,t_70#pic_center)