付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、上章顾单链表的基本操作,包括、删除以及查找双向链表和循环链表的区别家园家园-开发板商城/回第五章树和二叉树家园家园-开发板商城/预习检查二叉树树的遍历有哪几种方式树有哪些应用家园家园-开发板商城/本章结构家园家园-开发板商城/遍历二叉树二叉树树和二叉树树的逻辑结构和结构课程目标了解树的定义和基本术语了解二叉树的定义、性质、和结构掌握二叉树的遍历家园2015家园-开发板商城/5.1树的逻辑结构和结构5.1 .1树型结构实例1树祖父关系表示:R=,,,,,伯父父亲叔父堂兄堂姐本人堂弟侄儿(b)谱系的关系表示(a)树图5-1树家园2016家园-开发板商城/5.1书的目录结构2书的目录结构数据结构线性
2、表和广义表栈和队列树图线性表广义表队列栈树二叉树图5-2 书的目录家园2017家园-开发板商城/5.1树的逻辑结构和结构5.1 .2树的定义1树的定义树(Tree)是n (n0)个结点的有限集(记为T),T为空时称为空树,否则它满足以下两个条件:有且仅有一个结点没有前驱,称该结点为根结点(Root);除根结点以外,其余结点可分为m(m0)个互不相交的有限集合T0,Tl,Tm-1。其中每个集合又一棵树,树T0,Tl ,Tm-的根结点有且仅有一个直接1被称为根结点的(SubTree)。每棵前驱,但可以有0个或多个后继。树的逻辑结构表示数据之间的关系是一对多,或者多对一的关系。它的结构特点具有明显的
3、层次关系,是一种十分重要的非线性的数据结构。家园2018家园-开发板商城/ATT3T1T2BDCAEGHJKFIL( a)只有根结点的树( b) 有12个结点的树图5-3 树的示例图5-3 (a)是一棵只有一个根结点的树;图5-3 (b)是一棵有12个结点的树,即T=A,B,C,K, L 。A是根,除根结点A之外,其余的11个结点分为三个互不相交的集合。T1,T2和T3是根A的三棵,且本身又都是一棵树。所以树的201家递园归w的ww9家园-开发板商城/2树的基本术语树的结点包含一个数据元素及若干指向其的分支。的所有分支;1.2.3.树的结点:包含一个数据元素和指向其结点的度:一个结点拥有的个数
4、,度为零的结点称为叶子;树的度:树中所有结点的度的最大值 Max(D(I)含义:树中最大分支数为树的度;结点的层次及树的深度:根为第一层,根的孩子为第二层,若某结4.点为第k层,则其孩子为k+1层.树中结点的最大层次称为树的深度或高度 5.森林:是m(m 0)棵互不相交的树的集合森林与树概念相近,相互很容易转换.6 .有序树、无序树顺序,不得互换如果树中每棵家为园有从左向右的排列拥有一定的序树。20110家园-开发板商城/7.森林: 是m(m0)棵互不相交的树的集合。在树结构中,结点之间的关系又可以用下:关系描述,定义如孩子、双亲: 结点被称为孩子的双亲。子孙: 以某结点为根的孙。的根称为这个
5、结点的孩子,而这个结点又中的所有结点都被称为是该结点的子祖先: 从根结点到该结点路径上的所有结点。兄弟: 同一个双亲的孩子之间互为兄弟。12.堂兄弟:双亲在同一层的结点互为堂兄弟。家园20111家园-开发板商城/3.树的基本运算树的基本运算主要有: 初始化操作INITIATE(T):创建一棵空树。 求根函数ROOT(T):求树T的根;ROOT(X):求结点x所在树的根。 求双亲函数PARENT(T,x):在树T中求x的双亲。 求第i个孩子函数CHILD(T,x,i):在树T中求结点x的第i个孩子。 建树函数CREATETREE(x,F):建立以结点x为根,森林F为子树的树。6.遍历树操作TRA
6、VERSE(T):按顺序树T中各个结点。家园20112家园-开发板商城/5.1.3树的表示树的逻辑表示方法有多种,常见的有 :树形图表示法嵌套集合表示法(文氏图表示法)3 凹入表示法A4 广义表表示法DBEHKGFILJC(a)嵌套集合表示法(A (B(E (F), G),C ,D(H (I),J ,K(L ) ( b) 凹入表示法家c) 园广20113家园-开发板商城/ABEFGC DHIJ KL5.1.4树的结构和线性表一样,树可以用顺序和链式两种结构。结构适合树中结点比较“满”的情况。根据树的非线性树的顺序结构特点,常用链式方式来表示树。树常用的方法有:双亲存储表示法、孩子链表表示法和孩
7、子兄弟链表表示法。1双亲表示法一般采用顺序结构实现。用一组地址连续的单元来存放树的结点,每个结点有两个域:data域存放结点的信息;parent域存放该结点双亲结点的位置A序 号da t a p ar en t01特点:求结点的双2345678BC亲很容易,但求结点的孩子需要遍历DEFGHI整个向量。家园的 双 亲/结 构20114家园-开发板商城A-1 B0C0D1E1F1G2H4I4结构描述为:/定义数组空间的大小/定义数据类型#define typedef typedefMaxTreeSize100char Dastructype;ype data;parent;/结点数据/双亲位置域,
8、指示结点的双亲在数组中Da的位置 PTreeNode;typedefstructPTreeNoden; PTree;nodesMaxTreeSize;/结点总数T;是双亲链表PTree家园20115家园-开发板商城/2孩子链表表示法这是树的链式结构。每个结点的孩子用单链表,称为孩子链表。n个结点可以有n个孩子链表(叶结点的孩子链表为空表)。n个孩子链表的头指针用一个向量表示。头指针向量孩子链表0123456ABCDEF特 点 : 与 双 亲 相反,求孩子易,求双亲难。G(a)树(b)树的孩子结构5家-4园树20116家园-开发板商城/6543ABCDEFG12孩子链表表示法的类型说明typed
9、ef struct CNodechild;ype和MaxTreeSize由用户定义/Da/ 孩子链表结点/孩子结点在数组中对应的下标uct CNode *next; CNode; typedef struct/孩子链表头结点Da CN PTNode;ype data;/存放树中结点数据/孩子链表的头指针*child;typedef structPTNode nodesMaxTreeSize;/树的结点数和根结点的位置n,root; Ctree;CtreeT;/T的孩子链表表示家园20117家园-开发板商城/3孩子兄弟链表表示法孩子兄弟链表表示法也是树的一种链式结构。用二叉链表作为树的结构,每个
10、结点的左链域指向该结点的第一个孩子,右链域指向下一个兄弟结点。由于结点中的两个指针指示的分别为“孩子”和“兄弟”,故称为“孩子-兄弟链表”。这种结构也称为二叉链表。特点:双亲长子连接兄弟长子图5-5树的孩子-兄弟结构家园20118家园-开发板商城/GFEDCBA树的孩子兄弟链表的结构描述为:typedefstruct CSNodeElemTypedata;structCSNode*child,*nextsibling;CSNode,*CSTree;孩子兄弟的相互转换和树的结构的最大优点是可以方便地实现树和二叉树。但是,孩子兄弟结构的缺点也是查找当前结点的双亲结点比较麻烦,需要从树根结点开始逐个
11、结点比较查找。家园20119家园-开发板商城/5.1.5树的遍历1树的遍历所谓树的遍历,就是按照某种顺序依次树中各个结点,并使得每个结点只被一次。也就是把非线性结构的树结点变成线性序列的式 。树的遍历可以按深度优先遍历,也可以按照广度优先(按层次)遍历。深度优先遍历通常有两种方式:前序遍历和后序遍历。(1) 前序遍历的递归定义:若树T非空,则:根结点R;按照从左到右的顺序依次前序遍历根结点R 的各T1,T2,Tk。201家园20家园-开发板商城/(2) 后序遍历的递归定义:若树T非空,则:按照从左到右的顺序依次后序遍历根T的各Tl,T2,Tk;根结点R。再(3) 广度优先(按层)遍历广度优先(
12、按层次)遍历定义为:先第一层结点(即树根结点),直到树中结点全部被再从左至右第二层结点,依次按层为止。对图6-6 (a)中的树进行按层次遍历得到树的广度优先遍历序列为:ABCDEFG。说明: 前序遍历一棵树恰好等价于前序遍历该树所对应的二叉树。(6.2节将介绍二叉树)家价园于中ww序w遍 后序遍历树的二叉树。20121家园-开发板商城/树的先序遍历算法描述如下:/先根遍历k叉树voidPreorder(Btree(root!=NULL)*root)iff(“%cn”,root-data);根结点pr/for(i=0;iti);个子结点/递归前序遍历每一家园20122家园-开发板商城/5.2二叉
13、树5.2.1二叉树的定义与性质二叉树(Binary Tree)是另一种重要的树型结构。是度为2的有序树,它的特点是每个结点至多有两棵类似,二叉树的定义也可以用递归形式给出。1二叉树的递归定义。和树结构的定义二叉树(BinaryTree)是n(n0)个结点集(n=0),或者同时满足以下两个条件:的有限集。它或者是空(1)(2)有且仅有一个根结点;其余的结点分成两棵互不相交的树和右。家园20123家园-开发板商城/二叉树与树有区别:树至少应有一个结点,而二叉树可以为空;树的它是没有顺序,但如果二叉树的根结点只有一棵,必须明确区分树还是右,因为两者将不同形态的二叉树。因此,二叉树不是树的特例。它们是
14、两种不同的数据结构。二叉树有5种基本形态:(a)(b)( c)( d)(e)(a)空二叉树(b)只有根结点的二叉树(c)右为空的二叉树(d)(e) 左右树为空的二叉树不为空的二叉树-7 二家园20124家园-开发板商城/两种特殊形态的二叉树:满二叉树和完全二叉树。(1) 满二叉树(FullBinaryTree)深度为k,且有2k-1个结点的二叉树。特点:(1)每一层上结点数都达到最大(2)度为1的结点n1=0,树叶都在最下一层上。结点层序结点进行连续方法:从根结点起从上到下逐层(层内从左到右)对二叉树的K=3n=23-1=7。1235467家园20125家园-开发板商城/(2) 完全二叉树(C
15、omplete BinaryTree)深度为k,结点数为n的二叉树,当且仅当每个结点的都与相同深度的满二叉树中从1到n的结点一一对应时,称为完全二叉树。1图5-8 完全二叉树2354完全二叉树的特点:(1)每个结点i的树的深度Lhi- 其结点i的右的深度Rhi等于0或1; 叶结点只可能出现在层次最大或次最大的两层上。k-1 k (2)完全二叉树结点数n满家园(3)201满一定是完全二叉树,反之26家园-开发板商城/11LH2=0RH2=1LH1=3RH1=13232LH2-RH2=0-1=-14-RH =2LH51146非完全二叉树非完全二叉树家园20127家园-开发板商城/2二叉树的性质性质
16、1性质2在二叉树的第i层上至多有2i-1 个结点(i1)。深度为k的二叉树至多有2k-1个结点(k1)。(深度一定,二叉树的最大结点数也确定)二叉树中,终端结点数n0与度为2的结点数n2有如下关系: n0=n2+1结点数为n的完全二叉树,其深度为 log2n + l性质3性质4性质5在按层序的n个结点的完全二叉树中,任意一结点i(1in)有: i=1时,结点i是树的根;否则,结点i的双亲为结点 i/2 (i1) 。 2in时,结点i无左孩子,为叶结点;否则,结点i的左孩子为结点2i。家i无园右2012i+1n时的右孩子为结点2i+1。28家园-开发板商城/5.2.2二叉树的结构同线性表一样,二
17、叉树的结构也有顺序和链表两种结构。1顺序结构用一组地址连续的单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。1234 5 6 7 8 9 10 11完全二叉树ABCbt 3 的双亲为 3/2 =1,即在bt1中;其左孩子在bt2i=bt6中;子在bt2i+1=bt7中。DEFG家园20129家园-开发板商城/ABCDEFG0000,无结点处用0表示。一般二叉树也按完全二叉树形式二叉树ABC123456 7 8 9 10 1112DEFG这种结构仅适合于完全二叉树,既不浪费空间,又能很快确定结点的存放位置、结点的双亲和左右孩子的存放位置,但对一般二叉树,可能造成空间的大
18、量浪费。家园20130家园-开发板商城/ABCDE0000FG0000例如:深度为k,且只有k个结点的右单枝树(子),需2k-1个单元,即有2k-1-k个单元被浪费。每个非叶结点只有右孩链式结构 (二叉链表)设计不同的结点结构,可以有:二叉链表三叉链表不同的链式结构。常用的线索链表201用家存园放w指w向w e前mb驱ed或clu后b c继om的线索31家园-开发板商城/由于二叉树每个结点至多只有2个孩子,分别为左孩子和右孩子。因此可以把每个结点分成三个域:一个域存放结点本身的信息,另外两个是指针域,分别存放左、右孩子的地址。每个结点的结构表示为:其中左链域lchild为指向左孩子的指针,右链
19、域rchild为指向右孩子的指针,数据域data表示结点的值。若某结点没有左孩子或右孩子,其相应的链域为空指针。对应的结构类型定义如下:typedef struct nodeElemType structstructdata;nodenode*lchild;*rchild;BTree,*tree;其中,tree根结点家园20132家园-开发板商城/Lchilddatarchild二叉链表的结点结构二叉链表二叉树ACBDE说明:一个二叉链表由根指针root唯一确定。若二叉树为空,则root=NULL;若结点的某个孩子不存在,则相应的指针为空。具有n个结点的二叉链表有2n个指针域。其中只有n-1个
20、用来指示结点的左、右孩其余的家园20133家园-开发板商城/EDCBAlchilddatarchild3带双亲指针的二叉链表由于经常要在二叉树中寻找某结点的双亲时,可在每个结点上再加一个指向其双亲的指针parent,形成一个带双亲指针的二叉链表。就是三叉链表。三叉链表的结点结构三叉链表二叉树ACBDE性质6 含有n个结点的二叉链表中,有n+1个空链域。,家主园要二叉树201方法运算的频度。/34家园-开发板商城EDCBAlchilddataparentrchild5.2.3二叉树的基本运算实现1二叉树的基本运算Inittree (&T)功能:初始化操作 (建立一棵空的二叉树)。Root(T)功
21、能:求二叉树的根。Parent(T,x)功能:求二叉树T中值为x的结点的双亲。Lchild(T,x)功能:求结点的左孩子。Rchild(T,x)功能:求结点的右孩子。Traverse(T)功能:遍历或二叉树T。(7)Creatree(&T)功能:创建二叉树T家园20135家园-开发板商城/5.3遍历二叉树和线索二叉树5.3.1遍历二叉树在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树,即如何按某条搜索路径树中的每一个结点,使得每一个结点仅切仅被一次。遍历二叉树:指按一定的规律对二叉树的每个结点,一次的处理过程。且仅遍历对线性结
22、构是容易解决的。而二叉树是非线性的,因而需要寻找一种规律,使二叉树上的结点能排列在一个线性队列上,从而便于遍历。家园20136家园-开发板商城/是一种抽象操作,是对结点的某种处理,例如可以是求结点的度、或层次、打印结点的信息,或做其他任何工作。一次遍历后,使树中结点的非线性排列,按种线性排列。遍历的次序:假如以L、D、R分别表示遍历的先后顺序变为某树、遍历根结点和遍树,遍历整个二叉树则有DLR、LDR、LRD、DRL、RDL、RLD六种遍历方案。若规定先左后右,则只有前三种情况,分别规定为: DLR先(根)序遍历,LDR中(根)序遍历, LRD后(根)序遍历。1遍历方案LDR中序遍历;LRD
23、后序遍历;DLR先序遍历家园20137家园-开发板商城/1)中序遍历二叉树2)后序遍历二叉树算法:算法:若二叉树非空,则:若二叉树非空,则:1)中序遍历树后序遍历后序遍树树2)根结点3)中序遍算法描述:void Inorder (BiTree bt)/bt为根结点指针 if( bt)/根非空Inorder (bt-lchild) ; visit (bt-data); Inorder (bt-rchild) ;树3)根结点算法描述:voidtorder (BiTree bt)/bt为根结点指针if( bt)torder (bt-lchild) ; torder (bt-rchild) ;visi
24、t (bt -data);201家园38家园-开发板商城/3)先序遍历二叉树算法:若二叉树非空,则:1)根结点先序遍历先序遍树树例:表达式 a+b (c-d)-e/f遍历结果:中序: a+b c - d - e / f后序: abcd - + ef / -+bc/aef先序: -+a b - cd / ef家园20139家园-开发板商城/算法描述:void Preorder (BiTree bt)/bt为根结点指针 if( bt)/根非空visit (bt-data); Preorder (bt-lchild) ; Preorder (bt-rchild) ;2遍历算法(1)先序遍历的递归算法
25、如下(假定结点的元素值为字符型):#include typedef char ElemType;typedef struct node ElemType data; struct node *lchild; struct node *rchild;BTree; preorder(BTree *root) if(root!= NULL)/定义链表结构/定义结点值/定义结点指针/定义右子结点指针/前序遍历/如果不是空结点/输出当前结点值/递归前序遍历/递归前序遍f(“%cn”,root-data);der(root-lchild); prpre结点结点preorder(root-rchild);r
26、eturn;/结束家园20140家园-开发板商城/(2)中序遍历的递归算法如下(假定结点的元素值为字符型):void inorder(BTree *root) if(root!=NULL) inorder(root-lchild);/中序遍历/如果不是空结点/递归中序遍历/输出当前结点值/递归中序遍结点f(“%cn”,root-data);rder(root-rchild);pr结点(3) 后序遍历的算法实现void if(rotorder(BTree *root)!=NULL)/后序遍历/如果不是空结点/递归后序遍历/递归后序遍/输出当前结点值结点结点torder(root-lchild); torder(root-rchild);f(“%cn”,root-data);家园20141家园-开发板商城/通过上述三种不同的遍历方式得到三种不同的线性序列,它们的共同的特点是有且仅有一个开始结点和一个终端结点,其余各结点都有且仅有一个前驱结点和一个后继结点。从二叉树的遍历定义可知,三种遍历算法的不同之处仅在于根结点和遍历左右的先后关系。如果在算法中隐去和递归无关的语句prf(),则三种遍历算法是完全相同的。遍历
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加气混凝土配料浇注工安全理论考核试卷含答案
- 光伏砷化镓组件制造工班组建设模拟考核试卷含答案
- 加湿软麻工安全行为考核试卷含答案
- 钻井架安装工复试知识考核试卷含答案
- 高频等离子工岗前履职考核试卷含答案
- 2025年加气柱合作协议书
- 2025年电气、电子设备用玻璃部件相关工业品用玻璃部件项目发展计划
- 2025年照明器具生产专用设备合作协议书
- 2026年上海市黄浦区初三上学期语文一模试卷及答案
- 犬类介绍课件
- 2025年全国职业院校技能大赛中职组(母婴照护赛项)考试题库(含答案)
- 2026江苏盐城市阜宁县科技成果转化服务中心选调10人考试参考题库及答案解析
- 托管机构客户投诉处理流程规范
- 2026年及未来5年中国建筑用脚手架行业发展潜力分析及投资方向研究报告
- 银行客户信息安全课件
- 2026年四川单招单招考前冲刺测试题卷及答案
- 2026年全国公务员考试行测真题解析及答案
- 2026元旦主题班会:马年猜猜乐马年成语教学课件
- 架杆租赁合同
- 汽车美容装潢工(四级)职业资格考试题库-下(判断题汇总)
- 哈工大历年电机学试卷及答案详解
评论
0/150
提交评论