第7章zzh树形结构.ppt
《第7章zzh树形结构.ppt》由会员分享,可在线阅读,更多相关《第7章zzh树形结构.ppt(148页珍藏版)》请在三一办公上搜索。
1、第7章 树形结构,7.1 树的基本概念7.2 二叉树概念和性质7.3 二叉树存储结构7.4 二叉树的遍历7.5 二叉树的基本运算及其实现7.6 二叉树的构造7.7 线索二叉树7.8 哈夫曼树7.9树与二叉树的转换、森林与二叉树的转换7.9 并查集 本章小结,7.1 树的基本概念,7.1.1 树的定义,7.1.3 树的基本术语,7.1.2 树的表示,7.1.4 树的性质,7.1.5 树的基本运算,7.1.6 树的存储结构,7.1.1 树的定义 形式化定义:树:TK,R。K是包含n个结点的有穷集合(n0),关系R满足以下条件:(1)有且仅有一个结点k0K,它对于关系R来说没有前驱结点,结点k0称作
2、树的根。(2)除结点k0外,K中的每个结点对于关系R来说都有且仅有一个前驱结点。(3)K中每个结点对于关系R来说可以有多个后继结点。,递归定义:树是由n(n0)个结点组成的有限集合(记为T)。其中,如果n=0,它是一棵空树,这是树的特例;如果n0,这n个结点中存在(有仅存在)一个结点作为树的根结点,简称为根(root),其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。,7.1.2 树的表示,(1)树形表示法。这是树的最基本的表示,使用一棵倒置的树表示树结构,非常直观和形象。下图就是采用这种表示法。,(2)文氏图表示法。
3、使用集合以及集合的包含关系描述树结构。下图就是树的文氏图表示法。,(3)凹入表示法。使用线段的伸缩描述树结构。下图是树的凹入表示法。,(4)括号表示法。将树的根结点写在括号的左边,除根结点之外的其余结点写在括号中并用逗号间隔来描述树结构。下图是树的括号表示法。,7.1.3 树的基本术语 1.结点的度与树的度:树中某个结点的子树的个数称为该结点的度。树中各结点的度的最大值称为树的度,通常将度为m的树称为m次树。2.分支结点与叶结点:度不为零的结点称为非终端结点,又叫分支结点。度为零的结点称为终端结点或叶结点。在分支结点中,每个结点的分支数就是该结点的度。如对于度为1的结点,其分支数为1,被称为单
4、分支结点;对于度为2的结点,其分支数为2,被称为双分支结点,其余类推。,3.路径与路径长度:对于任意两个结点ki和kj,若树中存在一个结点序列ki,ki1,ki2,kin,kj,使得序列中除ki外的任一结点都是其在序列中的前一个结点的后继,则称该结点序列为由ki到kj的一条路径,用路径所通过的结点序列(ki,ki1,ki2,kj)表示这条路径。路径的长度等于路径所通过的结点数目减1(即路径上分支数目)。可见,路径就是从ki出发“自上而下”到达kj所通过的树中结点序列。显然,从树的根结点到树中其余结点均存在一条路径。,4.孩子结点、双亲结点和兄弟结点:在一棵树中,每个结点的后继,被称作该结点的孩
5、子结点(或子女结点)。相应地,该结点被称作孩子结点的双亲结点(或父母结点)。具有同一双亲的孩子结点互为兄弟结点。进一步推广这些关系,可以把每个结点的所有子树中的结点称为该结点的子孙结点,从树根结点到达该结点的路径上经过的所有结点被称作该结点的祖先结点。,5.结点的层次和树的高度:树中的每个结点都处在一定的层次上。结点的层次从树根开始定义,根结点为第1层,它的孩子结点为第2层,以此类推,一个结点所在的层次为其双亲结点所在的层次加1。树中结点的最大层次称为树的高度(或树的深度)。树中结点的最大层次称为树的高度(或树的深度)。6.有序树和无序树:若树中各结点的子树是按照一定的次序从左向右安排的,且相
6、对次序是不能随意变换的,则称为有序树,否则称为无序树。,7.森林:n(n0)个互不相交的树的集合称为森林。森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给n棵独立的树加上一个结点,并把这n棵树作为该结点的子树,则森林就变成了树。,7.1.4 树的性质性质1 树中的结点数等于所有结点的度数加1。证明:根据树的定义,在一棵树中,除树根结点外,每个结点有且仅有一个前驱结点。也就是说,每个结点与指向它的一个分支一一对应,所以除树根之外的结点数等于所有结点的分支数(度数),从而可得树中的结点数等于所有结点的度数加1。,性质2 度为m的树中第i层上至多有mi-1个结点,这里应
7、有i1。,证明(采用数学归纳法)对于第一层,因为树中的第一层上只有一个结点,即整个树的根结点,而由i=1代入mi-1,得mi-1=m1-1=1,也同样得到只有一个结点,显然结论成立。假设对于第(i-1)层(i1)命题成立,即度为m的树中第(i-1)层上至多有mi-2个结点,则根据树的度的定义,度为m的树中每个结点至多有m个孩子结点,所以第i层上的结点数至多为第(i-1)层上结点数的m倍,即至多为mi-2m=mi-1个,这与命题相同,故命题成立。,性质3 高度为h的m次树至多有 个结点。证明:由树的性质2可知,第i层上最多结点数为mi-1(i=1,2,h),显然当高度为h的m次树(即度为m的树)
8、上每一层都达到最多结点数时,整个m次树具有最多结点数,因此有:整个树的最多结点数=每一层最多结点数之和=m0+m1+m2+mh-1=。,性质4 具有n个结点的m次树的最小高度为logm(n(m-1)+1)。证明:设具有n个结点的m次树的高度为h,若在该树中前h-1层都是满的,即每一层的结点数都等于mi-1个(1ih-1),第h层(即最后一层)的结点数可能满,也可能不满,则该树具有最小的高度。其高度h可计算如下:,根据树的性质3可得:n乘(m-1)后得:mh-1n(m-1)+1mh以m为底取对数后得:h-1logm(n(m-1)+1)h即logm(n(m-1)+1)hlogm(n(m-1)+1)
9、+1因h只能取整数,所以 h=logm(n(m-1)+1)结论得证。,例7.1 含n个结点的三次树的最小高度是多少?最大高度是多少?解:设含n个结点的(为完全三次树时高度最小)的三次树的最小高度为h,则有:1+3+9+3h-2n1+3+9+3h-1(3h-1-1)/2 n(3h-1)/2 3h-12n+13h 即:h=log3(2n+1)最大高度为n-2。,7.1.5 树的基本运算,树的运算主要分为三大类:第一类,寻找满足某种特定关系的结点,如寻找当前结点的双亲结点等;第二类,插入或删除某个结点,如在树的当前结点上插入一个新结点或删除当前结点的第i个孩子结点等;第三类,遍历树中每个结点,这里着
10、重介绍。,树的遍历运算是指按某种方式访问树中的每一个结点且每一个结点只被访问一次。树的遍历运算的算法主要有先根遍历和后根遍历两种。注意,下面的先根遍历和后根遍历算法都是递归的。1.先根遍历 先根遍历过程为:(1)访问根结点;(2)按照从左到右的次序先根遍历根结点的每一棵子树。,2.后根遍历 后根遍历过程为:(1)按照从左到右的次序后根遍历根结点的每一棵子树;(2)访问根结点。,7.1.6 树的存储结构,1.双亲存储结构 这种存储结构是一种顺序存储结构,用一组连续空间存储树的所有结点,同时在每个结点中附设一个伪指针指示其双亲结点的位置。,树的双亲存储结构示意图,2.孩子链存储结构 孩子链存储结构
11、可按树的度(即树中所有结点度的最大值)设计结点的孩子结点指针域个数。下图(a)的树对应的孩子链存储结构如图(b)所示。,树的孩子链存储结构示意图,3.孩子兄弟链存储结构 孩子兄弟链存储结构是为每个结点设计三个域:一个数据元素域,一个该结点的第一个孩子结点指针域,一个该结点的下一个兄弟结点指针域。下图(a)的树对应的孩子兄弟链存储结构如图(b)所示。,树的孩子兄弟链存储结构示意图,7.2 二叉树概念和性质,7.2.1 二叉树概念,7.2.2 二叉树性质,7.2.3 二叉树与树、森林之间的转换,7.2.1 二叉树概念 二叉树也称为二次树或二分树,它是有限的结点集合,这个集合或者是空,或者由一个根结
12、点和两棵互不相交的称为左子树和右子树的二叉树组成。二叉树的定义是一种递归定义。,二叉树有五种基本形态,如下图所示,任何复杂的二叉树都是这五种基本形态的复合。,从定义看到,二叉树是一种特殊的树,其表示法也与树的表示法一样,有树形表示法、文氏图表示法、凹入表示法和括号表示法等。,在一棵二叉树中,如果所有分支结点都有左孩子结点和右孩子结点,并且叶结点都集中在二叉树的最下一层,这样的二叉树称为满二叉树。下图所示就是一棵满二叉树。可以对满二叉树的结点进行连续编号,约定编号从树根为1开始,按照层数从小到大、同一层从左到右的次序进行。图中每个结点外边的数字为对该结点的编号。,满二叉树的特点:基本特点是每一层
13、上的结点数总是最大结点数。满二叉树的所有的支结点都有左、右子树。可对满二叉树的结点进行连续编号,若规定从根结点开始,按“自上而下、自左至右”的原则进行,若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最下面一层的叶结点 都依次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树。如下图所示为一棵完全二叉树。同样可以对完全二叉树中每个结点进行连续编号,编号的方法同满二叉树相同。图中每个结点外边的数字为对该结点的编号。,完全二叉树是满二叉树的一部分,而满二叉树是完全二叉树的特例。完全二叉树的特点:若完全二叉树的深度为k,则所有的叶子结点都出现在第k层或k-1层。对于任一结点,如果其右子树
14、的最大层次为l,则其左子树的最大层次为l或l+1。,7.2.2 二叉树性质性质1:在非空二叉树中,第i层上至多有2i-1个结点(i1)。(为满二叉树时,结点最多:i=1时,第i层有1个结点;i=1时,第i层偶数个结点)性质2:深度为k的二叉树至多有2k-1个结点(k1)(包含根节点,结点总数为奇数)性质3:对任何一棵二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。性质4:n个结点的完全二叉树深度为:2n+1。其中符号:x表示不大于x的最大整数。(上口大)x 表示不小于x的最小整数。(上口小)书上二叉树的性质,性质5:若对一棵有n个结点的完全二叉树(深度为2n+1)的结点按
15、层(从第1层到第2n+1层)序自左至右进行编号,则对于编号为i(1in)的结点:若i=1:则结点i是二叉树的根,无双亲结点;否则,若i1,则其双亲结点编号是 i/2。如果2in:则结点i为叶子结点,无左孩子;否则,其左孩子结点编号是2i。如果2i+1n:则结点i无右孩子;否则,其右孩子结点编号是2i+1。,7.3 二叉树存储结构,7.3.1 二叉树的顺序存储结构,7.3.2 二叉树的链式存储结构,7.3.1 二叉树的顺序存储结构 二叉树的顺序存储结构中结点的存放次序是:对该树中每个结点进行编号,其编号从小到大的顺序就是结点存放在连续存储单元的先后次序。若把二叉树存储到一维数组中,则该编号就是下
16、标值加1(注意,C/C+语言中数组的起始下标为0)。树中各结点的编号与等高度的完全二叉树中对应位置上结点的编号相同。,二叉树存储结构的类型定义:#define MAX_SIZE 100 typedef telemtype sqbitreeMAX_SIZE;用一组地址连续的存储单元依次“自上而下、自左至右”存储完全二叉树的数据元素。,顺序存储结构,图6-6 二叉树及其顺序存储形式,最坏的情况下,一个深度为k且只有k个结点的单支树(二叉树每个结点只有一个孩子)需要长度为2k-1的一维数组。,7.3.2 二叉树的链式存储结构 在二叉树的链接存储中,结点的结构如下:typedef struct nod
17、e ElemType data;struct node*lchild,*rchild;BTNode;其中,data表示值域,用于存储对应的数据元素,lchild和rchild分别表示左指针域和右指针域,用于分别存储左孩子结点和右孩子结点(即左、右子树的根结点)的存储位置。,二叉树及其链式存储结构,7.4 二叉树的遍历,7.4.1 二叉树遍历的概念,7.4.2 二叉树遍历递归算法,7.4.3 二叉树遍历非递归算法,7.4.1 二叉树遍历的概念 二叉树的遍历是指按照一定次序访问树中所有结点,并且每个结点仅被访问一次的过程。它是最基本的运算,是二叉树中所有其他运算的基础。,1.先序遍历(先中后相对于
18、根结点,也即前序遍历)先序遍历二叉树的过程是:(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。2.中序遍历中序遍历二叉树的过程是:(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。,3.后序遍历后序遍历二叉树的过程是:(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根结点。,(1)先序遍历:root-leftchild-rightchild,6.3 遍历二叉树,先序遍历序列:A B D C,(2)中序遍历:leftchild-root-rightchild,中序遍历序列:B D A C,6.3 遍历二叉树,(3)后序遍历:leftchild-rightchild
19、-root,后序遍历序列:D B C A,6.3 遍历二叉树,(4)层次遍历,后序层次遍历序列:A B C D,6.3 遍历二叉树,如图所示的二叉树表示表达式:(a+b*(c-d)-e/f)按不同的次序遍历此二叉树,将访问的结点按先后次序排列起来的次序是:其先序序列为:-+a*b-cd/ef 其中序序列为:a+b*c-d-e/f 其后序序列为:abcd-*+ef/-,(5)三种遍历的相互转换:已知先序遍历与后序遍历,求中序遍历;(不唯一)已知先序遍历与中序遍历,求后序遍历;(唯一)已知中序遍历和后序遍历,求先序遍历。(唯一),6.3 遍历二叉树,例1:中序遍历序列为:badcfeg后序遍历序列
20、为:bdfgeca先序遍历序列为?abcdefg,6.3 遍历二叉树,例2:先序遍历为:12345678;中序遍历为:32416587;后序遍历为?34268751,6.3 遍历二叉树,例3:先序遍历为:ABCDEGF;后序遍历为:CGEFDBA;中序遍历为?CBEGDFA,6.3 遍历二叉树,对于二叉树的遍历,分别讨论递归遍历算法和非递归遍历算法。递归遍历算法具有非常清晰的结构,但初学者往往难以接受或怀疑,不敢使用。实际上,递归算法是由系统通过使用堆栈来实现控制的。而非递归算法中的控制是由设计者定义和使用堆栈来实现的。,7.4.2 二叉树遍历递归算法1.先序遍历的递归算法算法的递归定义是:若
21、二叉树为空,则遍历结束;否则 访问根结点;先序遍历左子树(递归调用本算法);先序遍历右子树(递归调用本算法)。,void PreOrder(BTNode*b)/*先序遍历的递归算法*/if(b!=NULL)printf(%c,b-data);/*访问根结点*/PreOrder(b-lchild);PreOrder(b-rchild);,2.中序遍历的递归算法算法的递归定义是:若二叉树为空,则遍历结束;否则 中序遍历左子树(递归调用本算法);访问根结点;中序遍历右子树(递归调用本算法)。,void InOrder(BTNode*b)/*中序遍历的递归算法*/if(b!=NULL)InOrder(
22、b-lchild);printf(%c,b-data);/*访问根结点*/InOrder(b-rchild);,3.后序遍历的递归算法算法的递归定义是:若二叉树为空,则遍历结束;否则 后序遍历左子树(递归调用本算法);后序遍历右子树(递归调用本算法);访问根结点。,void PostOrder(BTNode*b)/*后序遍历递归算法*/if(b!=NULL)PostOrder(b-lchild);PostOrder(b-rchild);printf(%c,b-data);/*访问根结点*/,7.4.3 二叉树遍历非递归算法,1.先序遍历非递归算法设T是指向二叉树根结点的指针变量,非递归算法是:
23、若二叉树为空,则返回;否则,令p=T;访问p所指向的结点;q=p-Rchild,若q不为空,则q进栈;p=p-Lchild,若p不为空,转(1),否则转(4);退栈到p,转(1),直到栈空为止。,void PreOrder2(BTNode*b)BTNode*StMaxSize,*p;int top=-1;top+;Sttop=b;/根结点入栈while(top-1)/栈不为空时循环 p=Sttop;top-;/退栈并访问该结点 printf(%c,p-data);if(p-rchild!=NULL)/右孩子结点入栈 top+;Sttop=p-rchild;if(p-lchild!=NULL)/
24、左孩子结点入栈 top+;Sttop=p-lchild;,2.中序遍历非递归算法(2)第二种方法(常规方法)由中序遍历过程可知,采用一个栈保存需要返回的结点指针,先扫描(并非访问)根结点的所有左结点并将它们一一进栈。然后出栈一个结点,显然该结点没有左孩子结点或者左孩子结点已访问过(进一步说明该结点的左子树均已访问),则访问它。然后扫描该结点的右孩子结点,将其进栈,再扫描该右孩子结点的所有左结点并一一进栈,如此这样,直到栈空为止。,设T是指向二叉树根结点的指针变量,非递归算法是:若二叉树为空,则返回;否则,令p=T 若p不为空,p进栈,p=p-Lchild;否则(即p为空),退栈到p,访问p所指
25、向的结点;p=p-Rchild,转(1);直到栈空为止。,void InOrder2(BTNode*b)BTNode*StMaxSize,*p;int top=-1;p=b;while(top-1|p!=NULL)while(p!=NULL)/扫描*p的所有左结点并进栈 top+;Sttop=p;p=p-lchild;if(top-1)p=Sttop;top-;/出栈*p结点 printf(%c,p-data);/访问之 p=p-rchild;/扫描*p的右孩子结点/end of while(top-1|p!=NULL),找*b的最左下结点,3.后序遍历非递归算法在后序遍历中,根结点是最后被访
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zzh 树形 结构
链接地址:https://www.31ppt.com/p-5644358.html