130 likes | 250 Vues
复习 有向图的邻接矩阵 定义:设有向图 D = <V , E> , V = {v1 , v2 , … , vn} , E = {e1 , e2 , … , em} 令 a ij 为顶点 vi 邻接到顶点 vj 边的条数,称 (a ij )) nxn 为 D 的邻接矩阵,记作 A(D) , 或简记为 A . 2 )邻接矩阵的性质 ( 1 )每 列元素之和 为结点的入度,即 ∑ a ij = d + (vi) , i = 1 , 2 , … , n , 所有列的和 ∑∑ a ij = ∑ d + (vi) = m ,等于边数
E N D
复习 有向图的邻接矩阵 定义:设有向图D=<V,E>,V={v1,v2,…,vn},E={e1,e2,…,em} 令aij为顶点vi邻接到顶点vj边的条数,称(aij))nxn为D的邻接矩阵,记作A(D),或简记为A. 2)邻接矩阵的性质 (1)每列元素之和为结点的入度,即 ∑aij= d+(vi),i=1,2,…,n, 所有列的和 ∑∑aij= ∑d+(vi) = m ,等于边数 每行元素之和为结点的出度,所有行的和也等于边数 (2)邻接矩阵中元素 aij反映了有向图中结点vi到vj通路长度为1的条数 主对角线上元素反映了有向图中结点到自身的环(回路)的条数 (3)要利用A(D)计算出D中长度为L的通路数和回路数,就需要用到邻接矩阵的幂次运算 (4)A2中的元素值bij是结点vi到vj长度为2 的通路条数: 说明:由矩阵的乘积定义 bij = ∑k aik * akj A3矩阵中的Cij元素值,表示了vi到vj长度为3 的通路条数。 推论 设BL=A + A2十…+AL (L≥1), 则BL中元素 bij为D中长度小于或等于L的通路数, 其中主对角线上元素值为D中长度小于或等于L的回路数
0 0 1 1 A2= 2 1 0 1 1 1 1 1 0 1 0 0 反映图中任意两个顶点间 有多少长度为2的通路 0 1 0 0 A= 0 0 1 1 1 1 0 1 1 0 0 0 4*4矩阵中有7个1(边) 例:给定有向图D,4个顶点7条边 邻接矩阵为 3 4 2 3 B4= 5 5 4 6 7 7 4 7 3 2 1 2 反映图中任意两个顶点间 有多少长度为小于等于4的通路 1 2 1 1 A4= 2 2 2 3 3 3 2 3 2 1 0 1 反映图中任意两个顶点间 有多少长度为4的通路 2 1 0 1 A3= 1 2 1 1 2 2 1 2 0 0 1 1 反映图中任意两个顶点间 有多少长度为3的通路
(3)A(D)中所有元素之和为D中长度为1的通路总条数。(3)A(D)中所有元素之和为D中长度为1的通路总条数。 主对角线的元素之和值为图中所有长度为1 的环的条数 要利用A(D)计算出D中长度为L的通路数和回路数,就需要用到邻接矩阵的幂次运算 (4)A2中的元素值bij是结点vi到vj长度为2 的通路条数: 说明:由矩阵的乘积定义 bij = ∑k aik * akj A3矩阵中的Cij元素值,表示了vi到vj长度为3 的通路条数。 (5)定理:设A为有向图D的邻接矩阵,V={v1,v2,…,vn} 为D的顶点集, 则A的L次幂AL(L≥1)中元素cij为D中vi到vj长度为L的通路数, 其中cii为vi到自身长度为L的回路数 ∑∑cij(所有元素之和)为D中长度为L的通路总数, 其中 ∑cii为D中长度为L的回路总数. 推论 设BL=A + A2十…+AL (L≥1), 则BL中元素 bij为D中长度小于或等于L的通路数, 其中主对角线上元素值为D中长度小于或等于L的回路数
4、有向图的可达矩阵 1)定义:设D=<V,E>为有向图, V={v1,v2,…,vn} 令 1 vi可达vi pij = 0 否则 称(pij)nxn为D的可达矩阵,记作P(D),简记为P 2)可达矩阵的性质 (1)主对角线元素均为1 (每个结点自身可达) (2)可通过图的邻接矩阵A的n-1次幂Bn-1得到(将其非零元素换为1,主对角线元素均设为1即可) 2 2 1 2 B3= 3 3 2 3 4 4 2 4 1 1 1 1 反映图中任意两个顶点间 有多少长度小于等于3的通路 1 1 1 1 P= 1 1 1 1 1 1 1 1 1 1 1 1 反映图中任意两个顶点间 是否可达 转树
第 十六 章 树 一、 无向树 1)定义: 连通无回路(初级回路或简单回路)的无向图称为无向树,或简称树 常用T表示树,平凡图称为平凡树. 若无向图G至少有两个连通分支,则称G为森林. 在无向树中,悬挂顶点称为树叶,度数大于或等于2的顶点称为分支点. 2)树的等价定义 设G=<V,E>是n阶m条边的无向图, 则下面各命题是等价的: (1)G是树. (2)G中任意两个顶点之间存在惟一的路径.(不同路径则构成回路) (3) G是连通的且 m = n - 1. (4) G中无回路且 m = n - 1. (5)G中没有回路,但在任何两个不同的顶点之间加一条新边, 在所得图中得到惟一的一个含新边的初级回路. (6)G是连通的,但删去任何一条边后,所得图不连通. 3)无向树的性质 定理: 设T是n阶非平凡的无向树,则T中至少有两片树叶 设:k个度为1的结点,其余结点的度大于等于2 例:无向树T中度为4、3、2的结点各一个,其余为树叶,树叶=?
4) 阶数n比较小的所有非同构的无向树. 例: 画出6阶所有非同构的无向树. m=n-1=5 从树的节点之和来分析: 例:7阶无向树中有3片树叶和1个3度顶点,其余3个顶点的度数均无1和3.试画出满足要求的所有非同构的无向树. 从树的节点之和来分析: Ti为满足要求的无向树,则边数mi = 6, 于是∑d(vi)=12=3+3 + d(v5)+d(v6)+d(v7) 二、生成树 定义2:设T是无向图G的子图并且为树,则称T为G的树. 若T是G的树且为生成子图,则称T是G的生成树. 设T是G的生成树,∀e∈ E(G),若e ∈ E(T),则称e为T的树枝, 否则称e为T的弦.并称导出子图G[E(G)-E(T)]为T的余树,记作T. 注:T不一定连通,也不一定不含回路 (2)生成树的性质 定理: 无向图G具有生成树当且仅当G是连通图. 设G为n阶m条边的无向连通图,则m =|E(G)|≥|E(T)| =n - 1. (3)设G是n阶m 条边的无向连通图,T为G的生成树, 则T的余树T中含m - n十1条边(即T有m—n+1条弦) (4)任何无向连通图G都存在生成树 (5)设n阶无向简单图G中有m条边,则m>=n-1.
3)带权图的最小生成树 (1) 定义5 设无向连通带权图:G=<V ,E,W > ,T是G的一棵生成树. T的各边权之和称为T的权,记作W(T); G的所有生成树中权最小的生成树称为G的最小生成树 (2) 最小生成树的求法(这里介绍避圈法Kruskal算法) 设n阶无向连通带权圈G = < V ,E, W > 有m条边. 不妨设G中没有环(否则,可以将所有的环先删去),将m条边按权从小到次顺序排列,设为e1,e2,…,em 取e1在T中,然后依次检查e2,e3,…,em.若ej(j≥2)与已在T中的边 不能构成回路,则取ej在T中,否则弃去ej. 算法停止时得到的T为G的最小生成树
§16.3 根树及其应用 设D是有向图,若D的基图是无向树,则称D为有向树,在所有的有向树中,根树最重要,所以在此只讨论根树。 一、根树 1、 定义:设T是n(n≥2)阶有向树 若T中有一个顶点的入度为0,其余顶点的入度均为1,则称T为根树。 入度为0的顶点称为树根(相当于文件系统的盘符)。 入度为1出度为0的顶点称为树叶(具体文件)。 入度为1出度不为0的顶点称为内点(文件夹),内点和树根统称为分支。 从树根到T的任意顶点v的通路(路径)长度称为v的层数。 层数最大顶点的层数称为树高.将平凡树也称为根树。 在根树中,由于各有向边的方向是一致的,所以画根树时可以省去各边上的所有箭头,并将树根画在最上方. 2、根树中顶点的关系 定义:设T为一棵非平凡的根树, ∀vi,vj∈ V(T),若vi可达vj,则称vi为vj的祖先,vj为vi的后代; 若vi邻接到vj(即<vi,vj> ∈E(T)则称vi为vj的父亲,而vj为vi的儿子 若vj,vk的父亲相同,则称vj与vk是兄弟
3、有序树 设T为根树,若将T中层数相同的顶点都标定次序,则称T为有序树。 根据根树T中每个分支点儿子数以及是否有序,可以将根树分成下列各类: (1)若T的每个分支点至多有r个儿子,则称T为r叉树; 又若r叉树是有序的,则称它为r叉有序树. (2)若T的每个分支点都恰好有r个儿子,则称T为r叉正则树; 又若T是有序的,则称它为r叉正则有序树. (3)若T是r叉正则树,且每个树叶的层数均为树高,则称T为r叉完全正则树, 又若T是有序的,则称它为r叉完全正则有序树。 4、r叉树的子树 定义: 设T为一棵根树,∀v∈ V(T), 称v及其后代的导出子图Tv为T的以v为根的根子树. 如:2叉正则有序树的每个分支点的两个儿子导出的根子树分别称为左子树和右子树.
二、根树的应用 1、最优2叉树 定义:设2叉树T有t片树叶v1,v2,…,vt,权分别为w1,w2,…,wt, 称 W(T)=∑wi l(vi)|为T的权,其中l(vi)|是vi的层数. 在所有有t片树叶,带权w1,w2,…,wt的2叉树中,权最小的2叉树称为最优2叉树 前面三棵带权2叉树 W(T1)=2(2+2)+3*3+5*3+3*2=38 W(T2)=4(3+5)+3*3+2*2+2=47 W(T3)=3*(3+3)+5*2+2(2+2)=36 下面介绍一种算法:Huffman算法(在给定权值下,如何构造最优2叉树) 给定实数(权值):w1,w2,…,wt,按从小到大排序为w1≤w2≤…≤wt. (1) 连接权为w1,w2的两片树叶,得一个分支点,其权为w1 + w2 (2) 在w1+w2,w3,w4…,wt中选出两个最小的权,连接它们对应的顶点(不一定是树叶),得新分支点及所带的权. (3)重复(2),直到形成t—1个分支点,t片树叶为止. 例:权值为 2,2,3,3,5的最优2叉树的构造过程: W(T4) =3*(2+2)+5*2+2(3+3)=34
2、前缀编码 在通信中,常用二进制编码表示符号. 对于不等长编码中出现的问题 1) 定义:设a1a2,…,an-1an为长为n的符号串, 称其子串a1, a1a2, …, a1a2…an-1分别为该符号串的 长度为1, 2, …, n-1的前缀. 设A={b1,b2,…bm }为一个符号串集合, 若对于任意的bi,bj∈A (i≠ j) bi与bj互不为前缀,则称A为前缀码. 若符号串bi(i=1,2,…,m)中只出现0,1两个符号,则称A为二元前缀码 {1,00,011,0101,0100,01001,01000 }不是前缀码 因为0100既是01001又是01000的前缀 {1,00,011,0101,01001,01000 }为前缀码. { 1,01,111,1100,0111 } 不是前缀码 2)利用二叉树产生二元前缀码 3)最优二元前缀码-利用哈夫曼树 3、二叉树的周游(遍历) 对于一棵二叉树的每一个结点都访问一次且仅一次的操作 周游的方法有三种: 中序遍历 访问的次序:左子树-根-右子树 前序遍历 访问的次序:根-左子树-右子树 后序遍历 访问的次序:左子树-右子树-根
树的周游(遍历)的结果: 得出结点的访问次序 1)表达式的(逆)波兰式表示:(a*(b+c)+d*e*f)/(g+(h-i)*j) 对应的二叉树 后序遍历的结果: ((a(bc+)*)(d(ef*)*)+)(g((hi-)j*)+)/ 逆波兰式 = abc+*def**+ghi-j*+/ 前序遍历的结果:/(+(*a(+bc))(*d(*ef)))(+g(*(-hi)j)) =/+*a+bc*d*ef+g*-hij 2)二叉排序树 建立(不断添加结点为其子树:比根结点小的为左子树 比根结点大的为右子树 利用周游得出排序结果(中序遍历) 作业:p319 1、2、3、4、13、25、31、37、38、39、41、42(2、3)