第3章非线性数据结构精选文档.ppt
《第3章非线性数据结构精选文档.ppt》由会员分享,可在线阅读,更多相关《第3章非线性数据结构精选文档.ppt(162页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第3章非线性数据结章非线性数据结构构本讲稿第一页,共一百六十二页第第3章章 非线性数据结构非线性数据结构 3.1 树及其基本概念树及其基本概念3.2 二叉树二叉树 3.3 二叉树的遍历二叉树的遍历 3.4 树的存储结构和遍历树的存储结构和遍历 3.5 树、森林与二叉树的转换树、森林与二叉树的转换 3.6 霍夫曼树及其应用霍夫曼树及其应用 本讲稿第二页,共一百六十二页3.7 图及其基本概念图及其基本概念 3.8 图的存储结构图的存储结构 3.9 图的遍历图的遍历 3.10 图的连通性及最小生成树图的连通性及最小生成树 习题习题 本讲稿第三页,共一百六十二页3.1 树及其基本概念树及其基本概念树
2、型结构是一种应用十分广泛的非线性数据结构,它很类似自然界中的树,直观地讲,树型结构是以分支关系定义的层次结构。树(Tree)是n(n0)个结点的有限集合。当n=0时称为空树,否则在任一非空树中:本讲稿第四页,共一百六十二页(1)有且仅有一个称为该树之根的结点;(2)除根结点之外的其余结点可分为m(m0)个互不相交的集合T1,T2,Tm,且其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。本讲稿第五页,共一百六十二页图3-1树型结构本讲稿第六页,共一百六十二页这是一个递归定义,即在树的定义中又用到了树,它显示了树的固有特性。树中的每一个结点都是该树中某一棵子树的根。如图3-1所示
3、的树中,A为根结点,其余的结点分为三个互不相交的有限集合:T1=B,E,F,T2=C,G,J,T3=D,H,I。T1、T2和T3都是A的子树,而它们本身也是一棵树。例如,T1是一棵以B为根的树,其余结点分为互不相交的两个集合E和F,而E和F本身又是仅有一个根结点的树。本讲稿第七页,共一百六十二页下面结合图3-1,给出树型结构中的一些基本术语。结点的度:一个结点拥有的子树数目。如A结点的度为3,它有三个子树T1、T2和T3。E、F结点的度为0,它们没有子树。叶子:度为零的结点称叶子或终端结点。树的度:一棵树上所有结点的度的最大值就是这棵树的度。本讲稿第八页,共一百六十二页结点的层次:根结点的层数
4、为1,其它任何结点的层数等于它的父结点的层数加1。树的深度:一棵树中,结点的最大层次值就是树的深度。图3-1中树的深度为4。森林:森林是m(m0)棵互不相交的树的集合。孩子(child):某结点子树的根称为该结点的孩子结点。本讲稿第九页,共一百六十二页双亲(parent):一个结点是它的那些子树的根的双亲结点。兄弟(sibling):同一个双亲的孩子之间互为兄弟。如A是B、C、D的双亲;B、C、D是A的孩子;B、C、D互为兄弟。堂兄弟(cousins):其双亲在同一层的结点互为堂兄弟。如G与E、F、H、I互为堂兄弟。本讲稿第十页,共一百六十二页有序树:树T中各子树T1,T2,Tn的相对次序是有
5、意义的,则称T为有序树。在有序树中,改变了子树的相对次序就变成了另一棵树。在计算机中表示一棵树时,就隐含着一种确定的相对次序,所以后面我们讨论的都是有序树。本讲稿第十一页,共一百六十二页3.2 二二 叉叉 树树3.2.1二叉树的定义及其性质1二叉树的定义一个二叉树是一个有限结点的集合,该集合或者为空,或由一个根结点和两棵互不相交的被称为该根的左子树和右子树的二叉树组成。这是一个递归定义,由定义可知二叉树有下面两个主要特点:本讲稿第十二页,共一百六十二页(1)每个结点最多只能有两个孩子,即二叉树中不存在度大于2的结点。(2)二叉树的子树有左、右之分,其次序不能任意颠倒。二叉树可以有五种基本形态,
6、如图3-2所示。本讲稿第十三页,共一百六十二页图3-2二叉树的五种基本形态本讲稿第十四页,共一百六十二页例3-1画出具有3个结点的树和二叉树的所有不同形态。解:(1)具有3个结点的树有2种不同的形态,如图3-3所示。图3-3有3个结点的所有树的不同形态本讲稿第十五页,共一百六十二页图3-3有3个结点的所有树的不同形态本讲稿第十六页,共一百六十二页(2)具有3个结点的二叉树有5种不同的形态,如图3-4所示。图3-43个结点的所有二叉树的不同形态本讲稿第十七页,共一百六十二页注意:树和二叉树的区别主要是二叉树的结点的子树要区分左子树和右子树,即使在结点只有一个子树的情况下,也要明确指出该子树是左子
7、树还是右子树。如二叉树T和T是不同的二叉树,但作为树,它们就是相同的。如图3-5所示。本讲稿第十八页,共一百六十二页图3-5二叉树与树的区别(a)二叉树T;(b)二叉树T;(c)树T本讲稿第十九页,共一百六十二页2二叉树的性质二叉树具有下列重要特性。性质1:在二叉树中,第i层的结点数最多有2i-1(i1)个。例如:层次i第i层最多结点数120=1221=2322=4k2k1此性质可以用数学归纳法证明。本讲稿第二十页,共一百六十二页性质2:在深度为k的二叉树中结点总数最多有2k1个。由性质1可见,深度为k的二叉树的最大结点数为:=2k1本讲稿第二十一页,共一百六十二页性质3:对任何一棵二叉树T,
8、如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。证明:(1)由于在二叉树中,任一结点的度数小于或等于2,所以其结点总数n=n0+n1+n2本讲稿第二十二页,共一百六十二页(2)设B为二叉树中总的分支数目,由于二叉树中除了根结点之外,其余结点都有一个分支进入,所以B=n1即n=B+1而这些分支只能是由度数为1或2的结点所发出,所以B=n1+2n2于是得:n=n1+2n2+1本讲稿第二十三页,共一百六十二页(3)由(1)和(2)得:n0+n1+n2=n1+2n2+1所以n0=n2+1证毕下面介绍两种特殊形态的二叉树,满二叉树和完全二叉树。如果一棵二叉树的深度为k,并且含有2k1个结
9、点,则称此二叉树为满二叉树。图3-6是一棵深度为4的满二叉树。本讲稿第二十四页,共一百六十二页图3-6深度为4的满二叉树本讲稿第二十五页,共一百六十二页可以看出这种树的特点是每一层的结点数都是最大结点数。对满二叉树的结点进行连续编号:从根结点起,自上而下逐层从左到右给每个结点编一个从1开始的顺序号。图3-6就成为图3-7。本讲稿第二十六页,共一百六十二页图3-7深度为4的满二叉树本讲稿第二十七页,共一百六十二页深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中的编号从1到n的结点一一对应时,称之为完全二叉树。如图3-8所示是一棵深度为4的完全二叉树。本讲稿第二十八页,共
10、一百六十二页图3-8深度为4的完全二叉树本讲稿第二十九页,共一百六十二页可以看出,完全二叉树有下面的特点:(1)叶子只可能在层次最大的两层上出现。(2)最下面一层的结点都集中在该层最左边的若干位置上。完全二叉树是一个十分重要的概念,在许多算法和算法分析中,都明显或隐含地用到了完全二叉树的概念。下面介绍完全二叉树的两个重要特性。性质4:具有n个结点的完全二叉树的深度为+1本讲稿第三十页,共一百六十二页证明:假设深度为k,则根据性质22k11n2k1或2k1n2k于是k1lbnk因为k是整数所以k=+1本讲稿第三十一页,共一百六十二页性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1
11、层到第+1层,每层从左到右),则对任一结点i(1in),有(1)如果i=1,则i是二叉树的根,无双亲;如果i1,则其双亲是结点。(2)如果2in,则结点i无左孩子;否则其左孩子是2i。(3)如果2i+1n,则结点i无右孩子;否则其右孩子是结点2i+1。证明从略。本讲稿第三十二页,共一百六十二页另外,还有两种特殊的二叉树,平衡二叉树和二叉排序树。二叉排序树将在第4章中介绍,这里只介绍平衡二叉树的概念。二叉树上任一结点的左子树深度减去右子树深度的差值,称为此结点的平衡因子。若一棵二叉树中,每个结点的平衡因子之绝对值都不大于1,则称这棵二叉树为平衡二叉树。本讲稿第三十三页,共一百六十二页例3-2图3
12、-9中有两棵二叉树,试判定其是否是平衡二叉树?解:二叉树(a)是平衡二叉树。二叉树(b)中结点C的平衡因子为2,大于1,故不是平衡二叉树。本讲稿第三十四页,共一百六十二页图3-9两棵二叉树本讲稿第三十五页,共一百六十二页 3.2.2 二叉树的存储结构对于二叉树,我们既可采用顺序存储,又可采用链式存储。1顺序存储结构顺序存储就是将一棵二叉树的所有结点按照一定的次序顺序存放到一组连续的存储单元中,为此,必须把二叉树中所有结点构成一个适当的线性序列,以使各个结点在这个序列中的相互位置能反映出结点之间的逻辑关系。本讲稿第三十六页,共一百六十二页对于完全二叉树,按图3-8中的编号顺序,就能得到一个足以反
13、映整个二叉树结构的线性序列。因此,可将完全二叉树中所有结点按编号顺序依次存储到一组连续的存储单元(即向量)中,这样既不浪费内存,又可以利用地址公式确定其结点的位置。但对于一般的二叉树,顺序分配常会造成内存的浪费,因为一般的二叉树也必须按完全二叉树的形式来存储。图3-8所示的完全二叉树,其顺序存储结构如图3-10(a)所示。本讲稿第三十七页,共一百六十二页而图3-10(b)所示的二叉树,其顺序存储结构如图3-10(c)所示,图中以“0”表示不存在此结点。在最坏情况下,一个深度为k且只有k个结点的单支树(树中无度为2的结点)却需要2k1个存储单元。可见,浪费很大。所以,一般情况下,还是用链表来表示
14、二叉树。本讲稿第三十八页,共一百六十二页图3-10二叉树的顺序存储结构本讲稿第三十九页,共一百六十二页 2链式存储结构因为树型结构是非线性的结构,所以在存储器里表示树型结构的最自然的方法是链式存储。根据二叉树的特性,任何一个结点最多有左、右两棵子树,所以每个结点至少设有三个域:数据域和左、右指针域。其结点结构为:lchildDatarchild本讲稿第四十页,共一百六十二页其中,lchild是左指针域,指向结点的左子树的根;data是数据域;rchild是右指针域,指向结点的右子树的根。这种存储结构又称为二叉链表。在二叉链表中,我们可以比较方便地从某个结点出发,找到它的一个子结点,但如果要从某
15、个结点找其父结点就比较麻烦了。有时为便于找到结点的双亲,还可增加一个指向其双亲的指针域(parent),其结点结构如下:lchilddataparentrchild本讲稿第四十一页,共一百六十二页由这种结点结构所得的二叉树存储结构称为三叉链表。另外,还需设一个指针T指向树的根。若树为空,则T=NULL,否则T指向树的根。例3-3画出给定二叉树的二叉链表和三叉链表存储结构。结果如图3-11所示。本讲稿第四十二页,共一百六十二页图3-11二叉树及其链表存储结构本讲稿第四十三页,共一百六十二页3.3 二叉树的遍历二叉树的遍历遍历二叉树就是按一定的次序,系统地访问树中的所有结点,使每个结点恰好被访问一
16、次。所谓访问结点,其含义是很广的,可以理解为对结点的增、删、修改等各种运算的抽象。在本节讨论中,假定访问结点即为输出结点数据域值。二叉树的遍历是最重要和最基本的运算,二叉树的许多操作都是以遍历为基础的。本讲稿第四十四页,共一百六十二页遍历二叉树的过程实际上就是按某种规律把二叉树的结点排成一个线性序列。由于二叉树是非线性结构,它的每个结点都可能有两个分支,也就是说一个结点可能有两个后继,所以,二叉树的遍历比较复杂,按照不同规则遍历得到的结果也就不同。令L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则对二叉树的遍历有六种规律:DLR、LDR、LRD、DRL、RDL、RLD。若规定先左后右,
17、则只有三种方案:DLR、LDR和LRD,按照访问根的先后,分别称之为二叉树的先序(根)遍历,中序(根)遍历和后序(根)遍历。本讲稿第四十五页,共一百六十二页基于二叉树的递归定义,可得下述遍历二叉树的递归算法定义。二叉树的三种遍历方式:(1)先序遍历:若二叉树为空,则空操作;否则访问根结点;先序遍历左子树;先序遍历右子树。本讲稿第四十六页,共一百六十二页(2)中序遍历:若二叉树为空,则空操作;否则中序遍历左子树;访问根结点;中序遍历右子树。(3)后序遍历:若二叉树为空,则空操作;否则后序遍历左子树;后序遍历右子树。访问根结点;本讲稿第四十七页,共一百六十二页二叉链表的C语言描述如下:struct
18、tnodeintdata;structtnode*lchild,*rchild;typedefstructtnodeTNODE;根据先序遍历的定义,先序遍历二叉树的递归算法如下:本讲稿第四十八页,共一百六十二页算法3-1先序遍历根结点指针为bt的二叉树。voidpreorder(TNODE*bt)if(bt!=NULL)printf(%dn,bt-data);preorder(bt-lchild);preorder(bt-rchild);本讲稿第四十九页,共一百六十二页根据中序遍历的定义,中序遍历二叉树的递归算法如下:算法3-2中序遍历根结点指针为bt的二叉树。voidinorder(TNOD
19、E*bt)if(bt!=NULL)inorder(bt-lchild);printf(%dn,bt-data);inorder(bt-rchild);本讲稿第五十页,共一百六十二页根据后序遍历的定义,后序遍历二叉树的递归算法如下:算法3-3后序遍历根结点指针为bt的二叉树。voidpostorder(TNODE*bt)if(bt!=NULL)postorder(bt-lchild);postorder(bt-rchild);printf(%dn,bt-data);本讲稿第五十一页,共一百六十二页下面重点以中序遍历为例,讨论二叉树的非递归遍历算法。利用一个辅助堆栈S,可以写出中序遍历二叉树的非递
20、归算法。算法3-4 中序遍历bt所指二叉树,s为存储二叉树结点指针的工作栈。Step1.初始化 置堆栈s为空,设置临时指针变量p(btp);Step2.判定p=NULL若p=NULL,则执行Step4;本讲稿第五十二页,共一百六十二页Step3.P进栈将p指针入栈,然后置p=p-lchild,返回Step2;Step4.取栈顶元素,并退栈若栈s为空,则算法结束,否则,将栈顶元素置指针变量P;Step5.访问结点p访问结点P,然后置p=p-rchild,并返回Step2。如果设定栈s采用顺序存储结构,则可给出C语言描述如下。本讲稿第五十三页,共一百六十二页#defineNm/*m为二叉树的结点个
21、数*/voidinorderf(TNODE*pt)TNODE*p;TNODE*sN;inttop=1;p=bt;while(p!=NULL)|(top!=1)本讲稿第五十四页,共一百六十二页while(p!=NULL)top+;stop=p;p=p-lchild;if(top!=1)本讲稿第五十五页,共一百六十二页p=stop;top;printf(%dn,p-data);p=p-rchild;本讲稿第五十六页,共一百六十二页分析此算法的运算量,假定二叉树T有n个结点,每个结点都要入栈和出栈一次。因此,入栈和出栈都要执行n次,对结点的访问当然也需执行n次。这样,中序遍历二叉树算法的时间复杂度为
22、O(n)。同理,只要改变对结点的访问位置,就可以容易地写出先序遍历二叉树的非递归算法。二叉树后序遍历的非递归算法要复杂一些,每个结点都要经过进栈出栈进栈出栈这样两个重复过程。第一次出栈是为了能访问右子树,第二次出栈才是访问结点本身。有兴趣的读者可以参阅有关书籍。本讲稿第五十七页,共一百六十二页例3-4 如图3-12所示的二叉树表示下述表达式:a+b*ce/f试写出它的三种遍历序列。解:先序遍历二叉树,按访问结点的先后次序将结点排列起来,可得先序遍历序列为:+a*bc/ef中序遍历序列为:a+b*ce/f本讲稿第五十八页,共一百六十二页后序遍历序列为:abc*+ef/从表达式来看,以上三个序列恰
23、好为表达式的前缀表示(波兰式)、中缀表示和后缀表示(逆波兰式)。本讲稿第五十九页,共一百六十二页图3-12二叉树本讲稿第六十页,共一百六十二页3.4 树的存储结构和遍历树的存储结构和遍历树在计算机内存储,可以用顺序存储方式、也可以用链式存储方式,这主要取决于要对树结构进行什么运算。这里主要介绍链式分配的存储结构。树的链式分配也有几种不同的方式。从结点指针域的个数是否固定来区分,可分为定长结点和不定长结点两种;从一个结点的各指针域存放的指针值的性质来区分,可以分为指向其所有孩子的多重链表和指向长子(最左边的孩子)及次弟(右邻的兄弟)的二叉链表,下面只介绍二叉链表。本讲稿第六十一页,共一百六十二页
24、 1二叉链表表示法二叉链表表示法又称二叉树表示法,或孩子兄弟表示法。即以二叉链表作为树的存储结构。链表中结点的两个指针域分别指向该结点的第一个孩子和下一个兄弟结点。图3-13是一棵树,该树的二叉链表如图3-14所示。利用这种存储结构便于实现各种树的操作,首先易于实现找结点孩子等的操作,如果再为每个结点增设一个PARENT域,则同样能方便地实现求某结点双亲的操作。本讲稿第六十二页,共一百六十二页图3-13树本讲稿第六十三页,共一百六十二页图3-14图3-13中树的二叉链表本讲稿第六十四页,共一百六十二页 2树的遍历树的遍历有两种次序:一种是先序遍历树;另一种是后序遍历树。(1)先序遍历树:先访问
25、树的根结点,然后从左到右依次先序遍历根的每棵子树。如先序遍历图3-13所示的树,得到的结点序列为:ABDEGHICF。(2)后序遍历树:先从左到右依次后根遍历每棵子树,然后访问根结点。如后序遍历图3-13所示的树,得到的结点序列为:DGHIEBFCA。本讲稿第六十五页,共一百六十二页3.5 树、森林与二叉树的转换树、森林与二叉树的转换由于二叉树和树都可用二叉链表作为存储结构,则以二叉链表作为媒介可导出树与二叉树之间的一个对应关系。也就是说,给定一棵树,可以找到惟一的一棵二叉树与之对应,从物理结构来看,它们的二叉链表是相同的,只是解释不同而已。图3-15给出了树与二叉树之间的对应关系。本讲稿第六
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 非线性 数据结构 精选 文档
限制150内