数据结构万扣树.pptx
《数据结构万扣树.pptx》由会员分享,可在线阅读,更多相关《数据结构万扣树.pptx(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、3.1 树的定义一.树的定义 树是n个数据元素的有限集(记为T),对任意一棵树T有:存在唯一一个称为根的数据元素;当n1时,其它数据元素可分为m(m0)个互不相交的有限集T1,T2,Tm,其中每个集合Ti(i=1,2,m)本身又是一棵树,并称树Ti是根的子树。第1页/共87页3.1 树的定义二.树的表示形式 倒悬树。是最常用的表示形式,如图6-1(b)。嵌套集合。是一些集合的集体,对于任何两个集合,或者不相交,或者一个集合包含另一个集合。图6-2(a)是图6-1(b)树的嵌套集合形式。广义表形式。图6-2(b)是树的广义表形式。凹入法表示形式。见P120 树的表示方法的多样化说明了树结构的重要
2、性。第2页/共87页3.1 树的定义ABDCEGFHIMJNKL(a)一般的树(b)嵌套集合形式HIJDFBKLECMNGA(c)广义表形式A(B(E(K,L),F),C(G(M,N),D(H,I,J))第3页/共87页3.1 树的定义三.树的基本术语1.树的结点:包含一个DE和指向其子树的所有分支;2.结点的度:一个结点拥有的子树的个数;度为零的结点称为叶结点;3.树的度:树中所有结点的度的最大值Max(D(I)含义:树中最大分支数为树的度4.结点的层次及树的深度:根为第一层,根的孩子为第二层,若某结点为第k层,则其孩子为k+1层;树中结点的最大层次称为树的深度或高度;5.森林:是m(m=0
3、)棵互不相的树的集合;森林与树概念相近,相互很容易转换;第4页/共87页3.1 树的定义1层2层4层3层depth=4DACBIJHGFEMLKheight=4第5页/共87页3.2 二叉树一.二叉树的概念 二叉树是结点数为0或每个结点最多只有左右两棵子树的树。二叉树是一种特殊的树结构,它的特点是:每个结点最多只有两棵子树,即不存在结点度大于2的结点;子树有左右之分,不能颠倒。问题:二叉树和度为问题:二叉树和度为2的树有何不同?的树有何不同?第6页/共87页3.2 二叉树二二.二叉树的性质二叉树的性质性质性质1 1.在二叉树的第在二叉树的第i i层上至多有层上至多有2 2i-1i-1个结点个结
4、点(i1)(i1)。证明证明:用归纳法用归纳法1.1.当当i=1,i=1,即第一层只有一个根结点即第一层只有一个根结点,显然显然 2 2i-1i-1=2 20 0=1=1成立成立2.2.假设对所有的假设对所有的j j上述性质成立上述性质成立,即第即第j j层上至多有层上至多有2 2j-1j-1个结点个结点3.3.要证明要证明i=j+1i=j+1时时,命题也成立。命题也成立。由归纳假设:第由归纳假设:第j j层上至多有层上至多有2 2j-1j-1个结点,又由于二叉树每个个结点,又由于二叉树每个结点的度最大为结点的度最大为2 2,所以第,所以第j+1j+1层上结点总数最多为第层上结点总数最多为第j
5、 j层上最大层上最大结点数的结点数的2 2倍。即倍。即2*22*2j-1j-1=2=2(j+1)-1(j+1)-1第7页/共87页3.2 二叉树性质性质2 2.深度为深度为k k的二叉树至多有的二叉树至多有2 2k k-1-1个结点个结点(k1)(k1)。(深度一定,二叉树的最大结点数也确定)(深度一定,二叉树的最大结点数也确定)证明:证明:深度为深度为k k的二叉树的最大结点数是二叉树的二叉树的最大结点数是二叉树中每层上结点的最大数之和。即中每层上结点的最大数之和。即 k k (第(第i i层上结点的最大数)层上结点的最大数)i=1 i=1 k k=2=2i-1 i-1=1+2+2=1+2+
6、22 2+2+2k-1k-1=2=2k k-1(-1(等比级数求和等比级数求和)i=1i=1第8页/共87页3.2 二叉树性质性质3 3.二叉树中二叉树中,终端结点数终端结点数n n0 0与度为与度为2 2的结点数的结点数n n2 2有有如下关系如下关系:n n0=0=n n2 2+1+1证明证明:设二叉树中度为设二叉树中度为i i的结点数为的结点数为n ni i,则则 结点总数结点总数n=nn=n0 0+n+n1 1+n+n2 2 除根结点外除根结点外,每个结点都是另一结点的孩子每个结点都是另一结点的孩子 孩子数孩子数=n-1=n-1;度为度为i i(i=0i=0,1 1,2 2)的结点,有
7、)的结点,有i i个孩子。个孩子。孩子数孩子数=2n=2n2 2+n+n1 1 n-1=2n n-1=2n2 2+n+n1 1 即即 n n0 0+n+n1 1+n+n2 2-1=2n-1=2n2 2+n+n1 1 故故 n n0 0=n n2 2+1 +1 第9页/共87页3.2 二叉树满二叉树满二叉树:深度为深度为k k,且有,且有2 2k k-1-1个结点的二叉树。个结点的二叉树。特点:(特点:(1 1)每一层上结点数都达到最大)每一层上结点数都达到最大 (2 2)度为)度为1 1的结点数的结点数n n1 1=0=0 结点层序编号方法:从根结点起从上到下逐层结点层序编号方法:从根结点起从
8、上到下逐层(层内从左到右)对二叉树的结点进行连续编号。(层内从左到右)对二叉树的结点进行连续编号。1237654k=3n=23-1=7 满二叉树满二叉树 第10页/共87页3.2 二叉树完全二叉树完全二叉树:深度为深度为k k,结点数为,结点数为n n的二叉树,的二叉树,当且仅当每个结点的编号都与相同深度的满二当且仅当每个结点的编号都与相同深度的满二叉树中从叉树中从1 1到到n n的结点一一对应时,称为完全二的结点一一对应时,称为完全二叉树。叉树。452131237654k=3n=23-1=7 满二叉树满二叉树 完全二叉树完全二叉树第11页/共87页3.2 二叉树LHLH2 2=0=0RHRH
9、2 2=1=11324653241LH1=3RH1=1LH1 -RH1=2 非完全二叉树非完全二叉树 非完全二叉树非完全二叉树LH2-RH2=0-1=-1第12页/共87页3.2 二叉树性质性质4.4.结点数为结点数为n n的完全二叉树,其深度为的完全二叉树,其深度为 loglog2 2n n +1+1证明:设深度为证明:设深度为k k,则则 由性质由性质2 2和完全二叉树定义有:和完全二叉树定义有:结点数结点数n n满足:满足:2 2k-1k-1-1-1n2n2k k-1-1 或写为或写为2 2k-1k-1nn2 2k k 于是有:于是有:k-1logk-1log2 2n nk k 因为因为
10、 k-1k-1和和k k均为整数均为整数 显然有显然有loglog2 2n n=k-1,=k-1,故故 k=k=loglog2 2n n +1+1第13页/共87页3.2 二叉树性质性质5.5.在按层序编号的在按层序编号的n n个结点的完全二叉树中,个结点的完全二叉树中,任意一结点任意一结点i(1in)i(1in)有:有:i=1i=1时,结点时,结点i i是树的根;否则是树的根;否则(i1)(i1),结点,结点i i的的双亲为结点双亲为结点i/2i/2。2i2in n时,结点时,结点i i无左孩子,为叶结点;否则,无左孩子,为叶结点;否则,结点结点i i的左孩子为结点的左孩子为结点2i2i。2
11、i+12i+1n n时,结点时,结点i i无右孩子;否则,结点无右孩子;否则,结点i i的的右孩子为结点右孩子为结点2i+12i+1。第14页/共87页3.2 二叉树三、二叉树的存储结构三、二叉树的存储结构 顺序存储结构顺序存储结构用一组地址连续的存储单元,以层序顺序存放二叉树用一组地址连续的存储单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。的数据元素,结点的相对位置蕴含着结点之间的关系。完全二叉树完全二叉树DCGFEBA bt3的双亲为的双亲为3/23/2=1,即在即在b t1中;中;其左孩子在其左孩子在bt2i=bt6中;中;其右孩子在其右孩子在bt2i+1=b
12、t7中。中。1 2 3 4 5 6 7 8 9 10 11 A B C D E F G 0 0 0 0bt第15页/共87页3.2 二叉树一般二叉树也按完全二叉树形式存储一般二叉树也按完全二叉树形式存储,没结点处用没结点处用0表示表示D 二叉树二叉树CGFEBA1 2 3 4 5 6 7 8 9 10 11 A B C D E 0 0 0 0 F G 0 0 0 0这种存储结构适合于完全二叉树,既不浪费存储空这种存储结构适合于完全二叉树,既不浪费存储空间,又能很快确定结点的存放位置、以及结点的双间,又能很快确定结点的存放位置、以及结点的双亲和左右孩子的存放位置,但对一般二叉树,可能亲和左右孩子
13、的存放位置,但对一般二叉树,可能造成存储空间的浪费。造成存储空间的浪费。第16页/共87页3.2 二叉树例如例如,深度为深度为k k,且只有,且只有k k个结点的右单枝树个结点的右单枝树(每个非叶结点只有右孩子每个非叶结点只有右孩子),需,需2 2k k-1-1个单元,个单元,即有即有2 2k k-1-k-1-k个单元被浪费。个单元被浪费。1k第17页/共87页3.2 二叉树 链式存储结构 设计不同的结点结构,可以构成不同的链式存储结构。常用的有:n 二叉链表n 三叉链表n 线索链表 用空链域存放指向前驱或后继的线索 第18页/共87页3.2 二叉树D 二叉树二叉树CEBAACBDE二叉链表二
14、叉链表leftChild data rightChilddataleftChildrightChild用于二叉树存储的链表结构,常见的有二叉链表和三叉链表用于二叉树存储的链表结构,常见的有二叉链表和三叉链表 二叉链表二叉链表的每个结点的结构描述如下:的每个结点的结构描述如下:struct BTNode int data;/数据域数据域 BTNode *lch;/左指针域左指针域 BTNode *rch;/右指针域右指针域 第19页/共87页3.2 二叉树三叉链表三叉链表的每个结点的结构描述如下:的每个结点的结构描述如下:struct node3 int data;/数据域数据域 node3 *
15、lch,*par,*rch;/par是双亲指针域是双亲指针域 ;leftChild data parent rightChildparentdataleftChildrightChild第20页/共87页(2)二叉树的链式存储形式二叉树的链式存储形式 例有一棵一般的二叉树,如图例有一棵一般的二叉树,如图6-8(a)所示。以二叉链所示。以二叉链表和三叉链表方式存储的结构图分别如图表和三叉链表方式存储的结构图分别如图6-8(b)、6-8(c)所示。所示。图6-8 二叉树及其链式存储结构(a)二叉树afedcbg(c)三叉链表 a b c d e f g T(b)二叉链表 a b c d e g f
16、 T第21页/共87页3.2 二叉树性质性质6 6.含有含有n n个结点的二叉链表中,有个结点的二叉链表中,有n+1n+1个空链域。个空链域。证明:空链域数证明:空链域数=2n=2n0 0+n+n1 1 因为因为 n=nn=n0 0+n+n1 1+n+n2 2 (1 1)又有又有 n n0 0=n=n2 2+1 +1 即即 -1=n-1=n2 2-n-n0 0 (2 2)(1 1)-(2 2)得)得 n+1=2nn+1=2n0 0+n+n1 1 故空链域数故空链域数=n+1=n+1第22页/共87页3.3 遍历二叉树二叉树最主要、最基本的运算是遍历。二叉树最主要、最基本的运算是遍历。遍历二叉树
17、是指以一定的次序访问二叉树中的每个结点,是指以一定的次序访问二叉树中的每个结点,并且每个结点仅被访问一次。并且每个结点仅被访问一次。访问结点是指对结点进行各种操作的简称。是指对结点进行各种操作的简称。例如,查询结点数据域的内容,或输出它的值,或找出结例如,查询结点数据域的内容,或输出它的值,或找出结点位置,或是执行对结点的其他操作。点位置,或是执行对结点的其他操作。遍历二叉树的过程遍历二叉树的过程实质实质是把二叉树的结点进行线性排列的是把二叉树的结点进行线性排列的过程。过程。第23页/共87页3.3 遍历二叉树二叉树的遍历就是按某种次序访问树中的结二叉树的遍历就是按某种次序访问树中的结点,要求
18、每个结点访问一次且仅访问一次。点,要求每个结点访问一次且仅访问一次。设设访问根结点访问根结点记作记作 V 遍历根的左子树遍历根的左子树记作记作 L 遍历根的右子树遍历根的右子树记作记作 R则可能的遍历次序有则可能的遍历次序有 前序前序 VLR 中序中序 LVR 后序后序 LRV第24页/共87页3.3 遍历二叉树对于二叉树的遍历,分别讨论递归遍历算法和非递归遍历算法。递归遍历算法具有非常清晰的结构,但初学者往往难以接受或怀疑,不敢使用。实际上,递归算法是由系统通过使用堆栈来实现控制的。而非递归算法中的控制是由设计者定义和使用堆栈来实现的。第25页/共87页3.3 遍历二叉树第26页/共87页先
19、序遍历二叉树1 递归算法递归算法算法的递归定义是:算法的递归定义是:若二叉树为空,则遍历结束;否则若二叉树为空,则遍历结束;否则 访问根结点;访问根结点;先序遍历左子树先序遍历左子树(递归调用本算法递归调用本算法);先序遍历右子树先序遍历右子树(递归调用本算法递归调用本算法)。第27页/共87页遍历二叉树先序遍历的递归算法void PreorderTraverse(BTNode *T)if(T!=NULL)visit(T-data);/*访问根结点 */PreorderTraverse(T-Lchild);PreorderTraverse(T-Rchild);说明:visit()函数是访问结点
20、的数据域,其要求视具体问题而定。树采用二叉链表的存储结构,用指针变量T来指向。第28页/共87页遍历二叉树第29页/共87页遍历二叉树/fe-dcb*a+第30页/共87页遍历二叉树2 非递归算法非递归算法设T是指向二叉树根结点的指针变量,非递归算法是:若二叉树为空,则返回;否则,令p=T;访问p所指向的结点;q=p-Rchild,若q不为空,则q进栈;p=p-Lchild,若p不为空,转(1),否则转(4);退栈到p,转(1),直到栈空为止。算法实现:第31页/共87页#define MAX_NODE 50void PreorderTraverse(BTNode *T)BTNode *Sta
21、ckMAX_NODE,*p=T,*q;int top=0;if (T=NULL)cout data);q=p-Rchild;if (q!=NULL)stack+top=q;p=p-Lchild;if(p=NULL&top0)p=stacktop;top-;while(p!=NULL);第32页/共87页中序遍历二叉树1 递归算法递归算法算法的递归定义是:算法的递归定义是:若二叉树为空,则遍历结束;否则若二叉树为空,则遍历结束;否则 中序遍历左子树中序遍历左子树(递归调用本算法递归调用本算法);访问根结点;访问根结点;中序遍历右子树中序遍历右子树(递归调用本算法递归调用本算法)。第33页/共87
22、页中序遍历二叉树中序遍历的递归算法void InorderTraverse(BTNode *T)if (T!=NULL)InorderTraverse(T-Lchild);visit(T-data);/*访问根结点 */InorderTraverse(T-Rchild);/*图6-8(a)的二叉树,输出的次序是:cbegdfa*/第34页/共87页中序遍历二叉树2 非递归算法非递归算法设T是指向二叉树根结点的指针变量,非递归算法是:若二叉树为空,则返回;否则,令p=T 若p不为空,p进栈,p=p-Lchild;否则(即p为空),退栈到p,访问p所指向的结点;p=p-Rchild,转(1);直到
23、栈空为止。算法实现:第35页/共87页#define MAX_NODE 50void InorderTraverse(BTNode *T)BTNode *StackMAX_NODE,*p=T;int top=0,bool=1;if (T=NULL)printf(“Binary Tree is Empty!n”);else do while(p!=NULL)stack+top=p;p=p-Lchild;if (top=0)bool=0;else p=stacktop;-top;visit(p-data);p=p-Rchild;while(bool!=0);第36页/共87页后序遍历二叉树1 递归
24、算法递归算法算法的递归定义是:算法的递归定义是:若二叉树为空,则遍历结束;否则若二叉树为空,则遍历结束;否则 后序遍历左子树后序遍历左子树(递归调用本算法递归调用本算法);后序遍历右子树后序遍历右子树(递归调用本算法递归调用本算法);访问根结点访问根结点。第37页/共87页后序遍历的递归算法void PostorderTraverse(BTNode *T)if (T!=NULL)PostorderTraverse(T-Lchild);PostorderTraverse(T-Rchild);visit(T-data);/*访问根结点 */*图6-8(a)的二叉树,输出的次序是:cgefdba *
25、/遍历二叉树的算法中基本操作是访问结点,因此,无论是哪种次序的遍历,对有n个结点的二叉树,其时间复杂度均为O(n)。第38页/共87页后序遍历二叉树 如图6-9所示的二叉树表示表达式:(a+b*(c-d)-e/f)按不同的次序遍历此二叉树,将访问的结点按先后次序排列起来的次序是:其先序序列为:-+a*b-cd/ef 其中序序列为:a+b*c-d-e/f 其后序序列为:abcd-*+ef/-/fe-dcb*a+图6-9 表达式(a+b*(c-d)-e/f)二叉树第39页/共87页后序遍历二叉树2 非递归算法非递归算法 在后序遍历中,根结点是最后被访问的。因此,在在后序遍历中,根结点是最后被访问的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 万扣树
限制150内