广东工业大学数据结构计算机专业硕士831数据结构与c语言考串,递归,数组和广义表吗?

《数据结构(C++版)(第二版)》第06章-学路网-学习路上 有我相伴
《数据结构(C++版)(第二版)》第06章
来源:DOCIN &责任编辑:李志 &
谁有《数据结构》(C语言版)严蔚敏,清华大学2005...答:数据结构(C语言版)严蔚敏清华大学出版社目录第1章绪论1.1什么是数据结构1.2基本概念和术语1.3抽象数据类型的表现与实现1.4算法和算法分析第2章线性表2.1线性表的类型定义2.2线性表的顺序表示和实现2.3线性表的链式表示和...《数据结构》里的数据对象,数据元素是什么意思,...答:数据结构一般是处理多个数据,而数据元素指的是数据的基本单位,数据对象是性质相同的数据元素的集合,比如编写一个管理一个班级学生成绩的程序,则一个学生就是数据元素,而班级则是数据对象。数据结构(c语言版)有什么参考书?答:我推荐《数据结构》(c语言版)(清华大学出版社,严蔚敏,吴伟民编著)教材。《清华大学计算机系列教材:数据结构(C语言版)》的第1章综述数据、数据结构和抽象数据类型等基本概念;第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、...《数据结构(C++版)(第二版)》第06章(图2)《数据结构(C++版)(第二版)》第06章(图4)《数据结构(C++版)(第二版)》第06章(图6)《数据结构(C++版)(第二版)》第06章(图8)《数据结构(C++版)(第二版)》第06章(图10)《数据结构(C++版)(第二版)》第06章(图12)数据结构要先学《离散数学》吗?问:有C语言基储想暑假回家闭关《数据结构》请问在数据结构要先学《离散数...答:我相信当你把这两门功课都学完后,会发觉最好的方式是先学《离散数序》再学《数据结构》,当然你硬要先学《数据结构》也是可以的。没有太大的影响。《计算机组成原理》应当在《汇编》之前学合适。防抓取,学路网提供内容。==========以下对应文字版==========学习《数据结构》课程的主要目的是什么答:学了以后你才能把现实世界中的问题,抽象成计算机能够表示的问题,然后利用计算机求解。现实中的事情抽象出来无非是三种数据结构:线性结构、树、图。防抓取,学路网提供内容。树和二叉树本章学习内容 6.1 树的基本概念 6.2 二叉树 6.3 遍历二叉树 6.4 线索二叉树 6.5 树和森林 6.6 回溯法与树的遍历 6.7 6.1树的基本概念 6.1.1 树的定义 1.树的定义 树是由n(n0)个结点组成的有限集合。《数据结构》主要讲了哪些内容?答:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。防抓取,学路网提供内容。若n=0,称为空树;若n>0,则: (1)有一个特定的称为根(root)的结点。考研《数据结构》严蔚敏是哪本,严蔚敏的书也有很...问:这是第一种第二种第三种答:严蔚敏的书怎么说呢,用起来很不爽,因为它的代码和它的算法就死两回事,它描述ADT和算法的时候用的是过程式自然语言的描述防抓取,学路网提供内容。它只有直接后继,但没有直接前驱。英文介绍《数据结构》问:要参加面试,谁能给我一段用英文介绍数据结构的材料啊?内容就是描述...答:给你一些介绍数据结构的链表,栈,队列,树,二叉树,以及图的特点和描述的英文吧,自己删除一些,写个大概:防抓取,学路网提供内容。(2)除根结点以外的其他结点可以划分为m(m0)个互不相交的有限集合T m-1,每个集合T (i=0,1,…,m-1)又是一棵树,称为根的子树,每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。《数据结构》《数据结构与算法》这两门课程有何不同答:算法要用到数据结构的知识,所以数据结构是基础,两本书都是围绕着数据结构来讲的。都包含数据结构和一些经典的查找排序算法等。防抓取,学路网提供内容。由此可知,树的定义是一个递归的定义,即树的定义中又用到了树的 概念。数据结构c语言版和java版有什么不同的精髓在这个基础上,每种语言都可以实现特定的数据结构,差别只在于语法实现级别。另外虽然Java/C++等语言都带有大量的标准类库,但这并不意味着可以忽视数据结构基防抓取,学路网提供内容。树的结构参见图6-1。急需数据结构C语言版(清华大学出版社)的期末考试试题及答案A.数据B.数据元素C.数据结构D.数据类型2.栈和队列都是(A)A.限制存取位置的线性结构B.顺序存储的线性结构C.链式存储的线性结构D.限防抓取,学路网提供内容。日 (a)空树(b)仅含有根结点的树(c)含有多个结点的树 图6-1 树的结构示意图 在图6-1(c)中,树的根结点为A,该树还可以分为三个互不相交的子集T 可以分解成T00 01两个不相交的子集,T 00 00又可以分为三个不 相交的子集T 000 002,其中,T 000 (a)T0子树(b)T1子树 (c)T2子树 图6-2 图6-1(c)中树的三个子树 2.树的逻辑结构描述 一棵树的逻辑结构可以用二元组描述为: tree k={ki1n0,kielemtype} 其中,n为树中结点个数,若n=0,则为一棵空树,n>0时称为一棵非空 树,而关系r应满足下列条件: (1)有且仅有一个结点没有前驱,称该结点为树根; (2)除根结点以外,其余每个结点有且仅有一个直接前驱; (3)树中每个结点可以有多个直接后继(孩子结点)。求构建一个线性表的完整程序数据结构C语言版????/*~~~~~~~~~~~~~~~~~~顺序表存储结构及常见操作(seqlist.c)~~~~~~~~~~~~~~~~*/#ifndef__SEQLI防抓取,学路网提供内容。日 3.树的基本运算树的基本运算可以定义如下几种: 1)inittree(&T) 初始化树T。严蔚敏的数据结构C语言版怎么学呀谈谈如何学习数据结构:1.如果你没有学过C语言,或者C语言学的不好的时候把数据结构当成一本数学书来学,它所讲述的都是一些简单的图论。在你的大脑中的主线不能丢失:线...防抓取,学路网提供内容。(2)root(T) 求树T的根结点。数据结构(c语言版)有什么参考书?我推荐《数据结构》(c语言版)(清华大学出版社,严蔚敏,吴伟民编著)教材。《清华大学计算机系列教材:数据结构(C语言版)》的第1章综述数据、数据结构和抽象数据类型等基防抓取,学路网提供内容。(3)parent(T,x) (5)addchild(y,i,x)把值为x的结点作为值为y的结点的第i个孩子插入到树中。数据结构C语言版习题,源代码求解&&&&&:创建一个链表&*全局变量和结构:无&nb...&&&&&防抓取,学路网提供内容。(6)delchild(x,i) 删除值为x的结点的第i个孩子。c语言版的数据结构和c++版的数据结构有什么不同C语言和C++描述数据结构最大的区别在于设置思想,C语言是一种结构化程序设计语言,而C++是一种面向对象的程序设计语言,它两者的区别主要在于数据和操作的防抓取,学路网提供内容。(7)traverse(T) 遍历或访问树T。求数据结构(c语言版)程序源代码1#include&string.h&2#include&stdio.h&3#include&stdlib.h&45#defineM防抓取,学路网提供内容。6.1.2 基本术语 (1)结点 指树中的一个数据元素,一般用一个字母表示。我想学习数据结构c语言版,谁有这个视频教程?谢谢去电马卢上搜索&严蔚敏&就会出现《计算机视频教程系列-数据结构教程-清华严蔚敏主讲》的视频楼主可以自己下载如果不想下载,可以去&qu防抓取,学路网提供内容。一个结点包含子树的数目,称为该结点的度。数据结构c语言版--顺序表的查找、插入与删除。怎么办?&#47;线性表存储的空间初始化分配量#defineLISTINCREAMENT10&#47;&#47;线性表存储空间的分配增量typedefst防抓取,学路网提供内容。(3)树叶(叶子) 度为0的结点,称为叶子结点或树叶,也叫做终端结点。防抓取,学路网提供内容。日 (4)孩子结点若结点X有子树,则子树的根结点为X的孩子结点,也称为孩子、儿子、子女等。其实互联网家装也就是近几年的事。之所以称作互联网家装,那么跟传统的家庭装修有什么关系?关联呢?其实说白了无非就是从线下到线上,再从线上到线下的一种运作模式。只不过是方便了普通的大众消费者,不用去实体店防抓取,学路网提供内容。如图6-1(c)中A的孩子为B,C,D。谢邀!王朔这种行为,很无耻!他就是一个不折不扣的痞子,他抨击金庸,无非就是蹭热度而已!不可否认王朔是一名优秀的作家,也有一定的才情,其作品也拥有一定的拥趸!但对他这种行为,我觉得很可笑!记得金庸在回复防抓取,学路网提供内容。(5)双亲结点 若结点X有子女Y,则X为Y的双亲结点。对于这个问题,首先要明确,抖一抖功能不能教条的认为窗口晃两下就算完事了,它本质的目的是为了提醒消息接收者查看,从这个角度来说,微信不仅可以抖,还可以震动,尖叫,甚至把闪光灯变成跑马灯,但这样一来消息发防抓取,学路网提供内容。(6)祖先结点 从根结点到该结点所经过分枝上的所有结点为该结点的祖先,如图6-1(c) 中M的祖先有A,D,H。我老公每月三千以上,大概五六千吧,我俩差不多。大的十一岁,小的十一个月。目前我在家休哺乳假,每个月只有两千多。虽然我俩收入不是很高,但好在稳定。父母都有退休金,不用管。我俩没有房贷车贷。目前没什么大的防抓取,学路网提供内容。(7)子孙结点 某一结点的子女及子女的子女都为该结点的子孙。只能说有钱就是任性,这也象征着武汉人对小龙虾深沉的爱啊。。宵夜的流行爆款三五年就更新换代,唯独小龙虾,在消夜领域十几年来占据着统治地位。在湖北一带,每到晚上人们都有消夜的习惯。宵夜的流行爆款三五年就更防抓取,学路网提供内容。(8)兄弟结点 具有同一个双亲的结点,称为兄弟结点。大学的宿舍人际关系是大学人际关系的重要组成部分,宿舍虽小,却是最直接参与人际交往的场所。不融洽的宿舍关系会影响青少年的心理健康发展,他们可能会表现出压抑、敏感、自我防御等特点。当宿舍内出现矛盾时,常常防抓取,学路网提供内容。(9)分枝结点 除叶子结点外的所有结点,为分枝结点,也叫做非终端结点。谢谢邀请!农村养老保险是我国政府为保障农村居民年老时基本生活而制定出来的农村养老保险制度,是我国的一种新型保险。在我国,凡是年满16周岁(不含在校学生)、未参加城镇职工基本养老保险的农村居民,可以在户防抓取,学路网提供内容。日 (10)层数根结点的层数为1,其他结点的层数为从根结点到该结点所经过的分支数目再加1。当普京在谢利格尔湖(特维尔,莫斯科以北350公里)参加的pro-Kremlin青年论坛讨论会照片登出后,许多俄罗斯人指出普京现在拥有蒙古人的眼睛和颧骨。“普京是蒙古人!”年轻的民主主义领袖罗曼?多布洛防抓取,学路网提供内容。(11)树的高度(深度) 树中结点所处的最大层数称为树的高度,如空树的高度为0,只有一个根结点的 树高度为1。2017系列品牌印花报告热辣出炉,小编整理后共分为魅惑的现代小碎花、异域的旋律、幻化的色彩、绽放的花卉、野性虎豹纹、午夜热带、补丁图案、圆点斑点、混搭条纹九大部分!【魅惑的现代小碎花】小碎花,是女性青防抓取,学路网提供内容。(12)树的度 树中结点度的最大值称为树的度。喜欢我的回答,请关注我,谢谢哦。西装给人印象似乎就是时尚绝缘体,但是你知道西装穿好了照样时髦吗,西装怎么搭配好看?首先去除正式感,选择不同款式和不同穿法很轻松便能把穿西装的你变成潮人,赶紧和我一起来学防抓取,学路网提供内容。(13)有序树 若一棵树中所有子树从左到右的排序是有顺序的,不能颠倒次序,称该树为有序树。△Tiffany&Co.蒂芙尼Bridal珠宝首先明确亮点,订婚戒指(EngagementRing)和结婚戒指(WeddingRing)是两码事。订婚钻戒通常选择单颗较大的钻石作为订婚信物,求防抓取,学路网提供内容。(14)无序树 若一棵树中所有子树的次序无关紧要,则称为无序树。有一天,有两条蛇在吃饭。眼镜蛇:“哥们,你说,咱们是毒蛇么?”银环蛇:“是啊,怎么了?”眼镜蛇:“额,我刚刚……不小心咬到舌头了……”银环蛇:“哈哈哈哈哈哈你真傻……哎呦……我也咬到了……好疼……”两防抓取,学路网提供内容。(15)森林(树林) 若干棵互不相交的树组成的集合为森林。胡子应该是男性魅力的一种象征,但是有的人特别讨厌胡子的,因为有胡子的脸上给人的感觉脏脏的,对于男士永久去胡子的方法我们应该会有自己的认识的,下面就跟小编一起来了解一下男士怎么样才能永久去胡子。  男士防抓取,学路网提供内容。一棵树可以看成是一个特殊的森林。如果抛开天美本身属于腾讯这个问题,假设性说王者荣耀是网易自主研发的游戏的话,我可以明确的告诉你这游戏必死无疑!不要觉得我在吓唬你,如果是昙花一现的那种游戏,网易有可能尝到点甜头,就如阴阳师一般。不过现防抓取,学路网提供内容。日 6.1.3树的表示 (1)树形结构表示法 具体参见图6-1。谢邀,别克-威朗2016款两厢GS20T双离合纵情运动型,上牌时间为2016年。仅形式6千公里,准新车,新车落地价22万,车主为了筹集资金,一口价准备15万出手,性价比非常高。别克-威朗属于紧凑型车,防抓取,学路网提供内容。具体参见图6-3。由于国内生育政策的限制及年轻女性对身材的要求,很多家庭都想生双胞胎,一次性解决生育问题,最好的就是可以生个龙凤胎,那样就完美了,但是双胞胎的几率是很小的,更何况是要龙凤胎。那么如何提高生龙凤胎的概率呢防抓取,学路网提供内容。(3)嵌套集合表示法 具体参见图6-4。通过一张清晰的流程图,生产第一线的工人可以直接的了解到产品的制作流程,从而进行把控,而管理层呢,则可以通过流程图来进行决策和制定对应的计划。如果出现了问题,则可以通过流程图快速的筛选出是哪里出错的,该防抓取,学路网提供内容。(4)广义表表示法 对图6-1(c)的树结构,广义表表示法可表示为: 日10 图6-3图6-1(c)的树的凹入法表示 图6-4 图6-1(c)的树的集合表示 日 11 6.1.4 树的性质 性质1 树中的结点数等于所有结点的度加1。“我不是针对谁,但说实话,现在大部分SUV都是娘炮!”“对越野车来说,什么外观内饰,花里胡哨的配置都是浮云,光看这些绝那是不懂车!”“你知道加了劣质油,发动机打不着的烦躁么?你经历过冰天雪地里陷车、拖车的痛苦么?你体会过无人区车子抛锚的绝望么?”……说到认知度及认可度最高的硬派越野车,人们往往想到帕杰罗和普拉多。目前,价格接近的进口三菱帕杰罗和国产丰田普拉多实际售价都在40万左右,两者都是在川青藏防抓取,学路网提供内容。证明:根据树的定义,在一棵树中,除根结点以外,每个结点有且仅有一个直 接前驱,也就是说,每个结点与指向它的一个分支一一对应,所以,除根结点 以外的结点数等于所有结点的分支数(即度数),而根结点无直接前驱,因此, 树中的结点数等于所有结点的度数加1。千万不要跑,下蹲身体拿起身边的任何东西,跃起大叫挥舞着手中的“武器”,且战且退,适时反击一下,并大声喊叫,如果是真正的恶犬,需要用衣服包裹左手让其撕咬,腾出右手很打狗的鼻咽眼部位,慢慢退出战斗,直到脱离视线接触后才能撒腿跑路防抓取,学路网提供内容。性质2 i-1个结点(i1)。现在,随着农村人不断涌入城市,毕业后的大学生大多数不愿意回到农村,城里的房价是蹭蹭蹭的往上涨。那么农村房子和院子在未来十年也会升值吗?针对这个问题,很多人认为一定会升值,理由如下。  当今城市房子  防抓取,学路网提供内容。下面用数学归纳法证明: 对于i=1,显然成立,假设对于i-1层,上述条件成立,即第i-1层最多有k i-2 点,对于第i层,结点数最多为第i-1层结点数的k倍(因为度为k),故第i层的结点数为k i-2 日12 性质3 深度为h的k叉树最多有 个结点。身高2米72奥尼尔到不了他肩膀?NBA最高人在他面前像和普通人没太大区别!我们都说NBA赛场长人如林,这里的长人不是说每个球员身高都像姚明,而是大多数球员身高都在2米左右,比正常人要高很多,也不是身高越高的球员就一定能够立足NBA,当一名球员身高过高时,就要去考量这名球员的脚步与身体素质,如果脚步灵活度与内线技术不合格,那么也很难立足于NBA,世界篮坛就有不少身高超过2米3但无法进入NBA的球员。防抓取,学路网提供内容。日13 性质4 具有n个结点的k叉树的最小深度为log (请注意,x表示取不小于x的最小整数,或叫做对x上取整。每一个时代都有令人难忘的美人,而人们的审美也会随时代改变。不错,在如今的中国娱乐圈美女如云,作为当红小花旦的迪丽热巴绝对算得上一等一的美女,她的美自不必赘述。但在世人的心目中,仅就美貌而言,奥黛丽?赫防抓取,学路网提供内容。) 证明:设具有n个结点的k叉树的深度为h,即在该树的前面h-1层都是满的,即 每一层的结点数等于k i-1 个(1ih-1),第h层(即最后一层)的结点数可能满, 也可能不满,这时,该树具有最小的深度。21世纪,人们的腰包慢慢变鼓,那些曾经叮铃铃响的硬币如今都到了我们家里的存钱罐里面。但是更多的人迈出了新的步伐,那就是钱币收藏,无论是纸币还是硬币都是有着收藏价值的。而硬币中主要有三类,长城币,老三花防抓取,学路网提供内容。由性质3可知,结点数n应满足下面 的条件: ,通过转换为:kh-1 <n(k-1)+1k ,再取以k为底的对数后,可以得到: (n(k-1)+1)+1,而h只能取整数,所以,该k叉树的最小深度为h=log (n(k-1)+1)。骏派A70骏派A70全系均采用1.6L自然吸气发动机,变速箱有5挡手动和6挡手自一体两种,自动挡最低配7.68万元,但是教授更加推荐自动挡的中配车型――L自动技术型。自动挡中配只是比低配贵了3000元,但是多出了天窗、多功能方向盘、定速巡航、后驻车雷达、倒车影像、中控大屏,轮胎也从15英寸升级为16英寸。启辰D50简单点来说,启辰D50可以看成是廉价版本的日产骐达,虽然车型是比较老防抓取,学路网提供内容。日 14 6.2 二叉树 6.2.1 二叉树的定义 1.二叉树的定义 和树结构定义类似,二叉树的定义也可以递归形式给出: 二叉树是n(n0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及 两棵不相交的左子树和右子树组成。谢邀。可以的呀,我现在就自己在做,接触到这行才知道,手工口红的好处,健康自己看的到的因为用的材料都是可以吃的,所以是很安全的!手工口红在颜色,滋润度,保湿度上面一点都不比大牌差!价格还亲民,就算多挑几个颜色也不会心疼大牌口红一支都两三百,喜欢口红的人会买好多颜色回来,可是品牌口红虽然加了防腐剂但也是会过期的,所以用不完就会很浪费!而手工口红虽然只有一年的保质期,但是没有防腐剂,不用担心安全问题,几防抓取,学路网提供内容。二叉树的特点是每个结点最多有两个孩子,或者说,在二叉树中,不存在度大于2 的结点,并且二叉树是有序树(树为无序树),其子树的顺序不能颠倒,因此,二 叉树有五种不同的形态,参见图6-5。01生物钟影响日本的研究者做了如下实验:刚开始为方便观察,让公鸡单独居住,结果公鸡都停止了打鸣。原来,公鸡打鸣是一种宣布自己领地的方式。于是研究者改为把40只纯种PNP公鸡每4个住在一间隔音隔光的房间防抓取,学路网提供内容。日 15 图6-5二叉树的五种不同形态 在图6-5所示的二叉树中,(a)为一棵空二叉树(b)为只有一个根结点的二叉 树,(c)为只有根结点及左子树的二叉树,(d)为只有根结点及右子树的二叉 树,(e)为有根结点及互不相交的左、右子树的二叉树(L表示左子树、R表示 右子树)。对于孩子的健康成长,总随时牵动着父母的心,特别是在孩子智力成长方面。刚刚又是一个新的学期,孩子学习能力差,课堂注意力不集中愁坏了不少父母。不少父母尝试了多种方法,也总提高不了孩子的注意力和学习力,那么,问题出在哪里呢?孩子注意力不集中,学习能力差的源头:缺锌有研究发现,人体所有神经元都含锌,人体认知功能相关的部位含锌最高。锌是目前WHO已确认的14种人体必需微量元素中,锌占第一位。此外,有相关调查防抓取,学路网提供内容。日 16 2.二叉树的基本运算 (1)inittree(&T) 二叉树的初始化。底子属于糯种的高端但是上不到冰种,底色发青内涵物较多绵多,A货翡翠无疑。镯子用料较宽,看问客的手腕属于富态体型所以镯子直径应该在59左右,用料较大,带点阳绿色。不足的地方就是这类发青发蓝的底色会让镯子防抓取,学路网提供内容。(2)root(T) 求二叉树的根结点。孩子生下来就是带业来的,所以这样并不奇怪,可以去四院求一个锁或者小手串,然后开光,放在孩子枕边或者枕头下面,最好是手串,吊坠,小锁什么的,怕孩子吃了,这样孩子就好了,如果家长有善心,可以在有时间的时候防抓取,学路网提供内容。(3)parent(T,x) 求二叉树T中值为x的结点的双亲。(4)lchild(T,x) 求二叉树T中值为x的结点的左孩子。(5)rchild(T,x) 求二叉树T中值为x的结点的右孩子。(6)lbrother(T,x) 求二叉树T中值为x的结点的左兄弟。日 17 (7)rbrother(T,x) 求二叉树T中值为x的结点的右兄弟。(8)traverse(T) 遍历二叉树T。(9)createtree(&T) 建立一棵二叉树T。(10)addlchild(&T,x,y) 在二叉树T中,将值为y的结点作为值为x的结点的左孩子插入。(11)addrchild(&T,x,y) 在二叉树T中,将值为y的结点作为值为x的结点的右孩子插入。(12)dellchild(&T,x) 在二叉树T中,删除值为x 的结点的左孩子。(13)delrchild(&t,x) 在二叉树T中,删除值为x 的结点的右孩子。日 18 6.2.2 二叉树的性质 性质1 若二叉树的层数从1开始,则二叉树的第k层结点数最多为2 k-1 可以用数学归纳法证明之。性质2 深度(高度)为k的二叉树最大结点数为2 k-1 证明:深度为k的二叉树,若要求结点数最多,则必须每一层的结点数都为最多,由性质1可知,最大结点数应为每一层最大结点数之和,即为2 +…+2k-1 -1。性质3 对任意一棵二叉树,如果叶子结点个数为n +1。证明:设二叉树中度为1的结点个数为n ,根据二叉树的定义可知,该二叉树的结点数n=n +1。日 19 为继续给出二叉树的其他性质,先定义两种特殊的二叉树。满二叉树 深度为k具有2 k-1 个结点的二叉树,称为满二叉树。从上面满二叉树的定义可知,必须是二叉树的每一层上的结点数都达到最大,否则就 不是满二叉树。完全二叉树 如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为 k的满二叉树中编号为1~ n的结点一一对应,则称这棵二叉树为完全二叉树。从完全二叉树的定义可知,结点的排列顺序遵循从上到下、从左到右的规律。所谓从 上到下,表示本层结点数达到最大后,才能放入下一层。从左到右,表示同一层结点 必须按从左到右排列,若左边空一个位置,则不能将结点放入右边。日 20 从满二叉树及完全二叉树的定义还可以知道,满二叉树一定是一棵完全二叉树, 反之完全二叉树不一定是一棵满二叉树。满二叉树的叶子结点全部在最底层,而 完全二叉树的叶子结点可以分布在最下面两层。深度为4的满二叉树和完全二叉 树如图6-6所示。(a)满二叉树(b)完全二叉树 图6-6 满二叉树和完全二叉树示意图 日 21 性质4 具有n个结点的完全二叉树高度为log (n)+1或log (n+1)。(注意:x表示取不大于x的最大整数,也叫做对x下取整,x表示取不小于x的 最小整数,也叫做对x上取整。) 证明:设该完全二叉树高度为k,则该二叉树的前面k-1层为满二叉树,共有2 k-1 -1 个结点,而该二叉树具有k层,第k层至少有1个结点,最多有2 k-1 个结点。因此有 下面的不等式成立:(2 k-1 -1) +1n k-1-1)+2 k-1 ,即有2 k-1 -1。由式子后半部分可知: -1…由式子前半部分可知: (n+1)]。即得到第二个结论。k-1n,同时取对数得:klog n+1即k=log n]+1,即第一个结论成立,证毕。日 22 性质5 如果将一棵有n个结点的完全二叉树从上到下、从左到右对结点编号1, 2,…,n(注:有的书从0,1,2,…,n-1进行编号,则下面的结论有所不同), 然后按此编号将该二叉树中各结点顺序地存放于一个一维数组中,并简称编号为j 的结点为j(1jn),则有如下结论成立: (1)若j=1,则结点j为根结点,无双亲,否则j的双亲为j/2; (2)若2jn,则结点j的左子女为2j,否则无左子女。即满足2j>n的结点为叶子结点; (3)若2j+1n,则结点j的右子女为2j+1,否则无右子女; (4)若结点j序号为奇数且不等于1,则它的左兄弟为j-1; (5)若结点j序号为偶数且不等于n,它的右兄弟为j+1; (6)结点j所在层数(层次)为log j+1。日 23 6.2.3 二叉树的存储结构 1.顺序存储结构 将一棵二叉树按完全二叉树顺序存放到一个一维数组中,若该二叉树为非完全二叉 树,则必须将相应位置空出来,使存放的结果符合完全二叉树形状。图6-7给出了顺 序存储形式。(a)完全二叉树的存储形式(b)非完全二叉树的存储形式 图6-7 二叉树的顺序存储形式 日 24 在二叉树的顺序存储结构中,各结点之间的关系是通过下标计算出来的,为了与 6.2.2节中的性质5对应,建议数组下标不从0开始,而是从1开始使用!因此,图 6-7中数组下标可考虑从1开始。因此,访问每一个结点的双亲、左右孩子及左右 兄弟(如果有的话)都是相当方便的。例如,对于编号为j的结点,双亲结点编号 为j/2,左孩子结点编号为2j,右孩子结点编号为2j+1,左兄弟结点编号为j-1, 右兄弟结点编号为j+1。对于一棵二叉树,若采用顺序存储,当它为完全二叉树时,比较方便,若为非完 全二叉树,将会浪费大量存储单元。最坏的非完全二叉树是全部只有右分支,设 高度为k,则需占用2k-1个存储单元,而实际只有k个元素,实际只需k个存储单元。因此,对于非完全二叉树,宜采用下面的链式存储结构。日 25 2.二叉链表存储结构 (1)二叉链表表示 将一个结点分成三部分,一部分存放结点本身的信息,另外两部分为指针,分别存放左、 右孩子的地址。二叉链表中一个结点可描述为: 1child data rchild 对于图6-7所示的二叉树,用二叉链表形式描述见图6-8。日 26 (a)完全二叉树的链表(b)非完全二叉树的二叉链表 图6-8 二叉树的二叉链表表示法 日 27 对于一棵二叉树,若采用二叉链表存储,当二叉树为非完全二叉树时,比较方便, 若为完全二叉树,将会占用较多的存储单元(存放地址的指针)。若一棵二叉树有 n个结点,采用二叉链表作存储结构时,共有2n个指针域,其中只有n-1个指针指 向左右孩子,其余n+1个指针为空,没有发挥作用,被白白浪费掉了(当然后面介 绍的线索化二叉树可以利用它)。(2)二叉链表的数据类型 二叉链表的数据类型描述如下: class bitree public: //结点数据类型 bitree *lchild, * //定义左、右孩子为指针型 日28 (3)二叉链表的建立 为了后面遍历二叉树方便,先介绍建立二叉链表的算法(假设elemtype 为char型)。假设二叉链表的数据类型描述如刚才所述,为建立二叉链表,用一个一维表数组来 模拟队列,存放输入的结点,但是,输入结点时,必须按完全二叉树形式,才能使 结点间满足性质5,若为非完全二叉树,则必须给定一些假想结点(虚结点),使 之符合完全二叉树形式。为此,我们在输入结点值时,存在的结点则输入它对应的 字符,不存在的结点(虚结点),输入逗号,最后以一个特殊符号“#”作为输入的 结束,表示建二叉链表已完成。建成的二叉链表可以由根指针root惟一确定。算法描述如下: #include t class bitree public: bitree *lchild,* bitree *creat(); 日29 bitree *bitree::creat() bitree*q[100]; //定义q数组作为队列,存放二叉链表中的结点,100为最大容量 bitree //二叉链表中的结点bitree *root //二叉链表的根指针int front=1,rear=0; //定义队列的头、尾指针 //结点的data域值 root=NULL; cin>> while(ch!='#') //输入值为#号,算法结束 s=NULL;if(ch!=',') //输入数据不为逗号,表示不为虚结点,否则为虚结点 s= s->data= s->lchild=NULL; s->rchild=NULL; rear++;q[rear]=s; //新结点或虚结点进队 if(rear==1) root=s; else if(rear%2==0)q[front]->lchild=s; //rear为偶数,s为双亲左孩子 else q[front]->rchild=s;} //rear为奇数,s为双亲右孩子 if(rear%2==1) front++; cin>>}} 日 30 例如,对图6-9所示的二叉树,建立的二叉链表如图6-10所示。(a)非完全二叉树(b)增加虚结点后假想为完全二叉树 图6-9 一棵非完全二叉树假想为完全二叉树 日 31 图6-10用上述算法建成的二叉链表 对图6-9(a)所示的二叉树,要用算法建成图6-10所示的二叉树链表,从键盘输 入的数据应为:AB,,C,,,,D#其中#为输入结束,为回车符。日 32 6.2.4 二叉树的抽象数据类型 二叉树的抽象数据类型可描述为: ADT binarytree Data:元素a1,a2,…,an,由一个根结点及两棵互不相交的左右子树组成 Operation: void inittree(&T) //二叉树的初始化 bitree *root(T) //求二叉树的根结点 bitree *parent(T,x) //求二叉树T中值为x的结点的双亲 bitree *lchild(T,x) //求二叉树T中值为x的结点的左孩子 bitree rchild(T,x)//求二叉树T中值为x的结点的右孩子 bitree lbrother(T,x)//求二叉树T中值为x的结点的左兄弟 bitree rbrother(T,x)//求二叉树T中值为x的结点的右兄弟 日 33 void traverse(T) //遍历二叉树T bitree *createtree( //建立一棵二叉树Tvoid addlchild(&T,x,y) //在二叉树T中,将值为y的结点作为值为 x的结点的左孩子插入 void addrchild(&T,x,y) //在二叉树T中,将值为y的结点作为值为 x的结点的右孩子插入 void dellchild(&T,x) //在二叉树T中,删除值为x 的结点的左 孩子 void delrchild(&t,x) //在二叉树T中,删除值为x 的结点的右 孩子 end binarytree 日 34 6.3 遍历二叉树 所谓遍历二叉树,就是遵从某种次序,访问二叉树中的所有结点,使得每个结点 仅被访问一次。这里提到的“访问”是指对结点施行某种操作,操作可以是输出结点信息,修改 结点的数据值等,但要求这种访问不破坏它原来的数据结构。在本书中,我们规 定访问是输出结点信息data,且以二叉链表作为二叉树的存储结构。由于二叉树是一种非线性结构,每个结点可能有一个以上的直接后继,因此,必须 规定遍历的规则,并按此规则遍历二叉树,最后得到二叉树所有结点的一个线性序 令L,R,D分别代表二叉树的左子树、右子树、根结点,则遍历二叉树有6种规则:DLR、DRL、LDR、LRD、RDL、RKD。若规定二叉树中必须先左后右(左右顺序 不能颠倒),则只有DLR、LDR、LRD三种遍历规则。DLR称为前根遍历(或前序 遍历、先序遍历、先根遍历),LDR称为中根遍历(或中序遍历),LRD称为后根 遍历(或后序遍历)。日 35 6.3.1 前根遍历 所谓前根遍历,就是根结点最先遍历,其次左子树,最后右子树。1.递归遍历 前根遍历二叉树的递归遍历算法描述为: 若二叉树为空,则算法结束;否则: (1)输出根结点; (2)前根遍历左子树; (3)前根遍历右子树。算法如下: 日 36 void bitree::preorder(bitree *root) p=if(p!=NULL) {cout<data<lchild);preorder (p->rchild); 2.非递归遍历利用一个一维数组作为栈,来存储二叉链表中的结点,算法思想为: 从二叉树根结点开始,沿左子树一直走到末端(左孩子为空)为止,在走的过程 中,访问所遇结点,并依次把所遇结点进栈,当左子树为空时,从栈顶退出某结 点,并将指针指向该结点的右孩子。如此重复,直到栈为空或指针为空为止。日 37 算法如下: void bitree::preorder1(bitree *root) bitree*p,*s[100]; 为一个栈int top=0; //top为栈顶指针 p= while((p!=NULL)||(top>0)) while(p!=NULL){cout<data<//进入左子树 p=p->//进入右子树 日38 6.3.2 中根遍历 所谓中根遍历,就是根在中间,先左子树,然后根结点,最后右子树。1.递归遍历 中根遍历二叉树的递归遍历算法描述为: 若二叉树为空,则算法结束;否则 (1)中根遍历左子树; (2)输出根结点; (3)中根遍历右子树。算法如下: 日 39 void bitree::inorder(biteee *root) inorder(p->lchild);cout<data<<" 2.非递归遍历同样利用一个一维数组作栈,来存储二叉链表中的结点,算法思想为: 从二叉树根结点开始,沿左子树一直走到末端(左孩子为空)为止,在走的过程中, 把依次遇到的结点进栈,待左子树为空时,从栈中退出结点并访问,然后再转向它 的右子树。如此重复,直到栈空或指针为空为止。日 40 算法如下: void bitree::inorder1( bitree *root) bitree*p,*s[100]; //s为一个栈,top为栈顶指针 int top=0; p= while((p!=NULL)||(top>0)) while(p!=NULL){s[++top]=p; p=p->}//进入左子树 {p=s[top--]; p=p->//进入右子树 日41 6.3.3 后根遍历 所谓后根遍历,就是根在最后,即先左子树,然后右子树,最后根结点。1.递归遍历 后根遍历二叉树的递归遍历算法描述为: 若二叉树为空,则算法结束;否则: (1)后根遍历左子树; (2)后根遍历右子树; (3)访问根结点。日 42 算法如下: void bitree::postorder( bitree *root) p=if(p!=NULL) postorder(p->lchild); postorder (p->rchild); cout<data<<" 2.非递归遍历利用栈来实现二叉树的后序遍历要比前序和中序遍历复杂得多,在后序遍历中, 当搜索指针指向某一个结点时,不能马上进行访问,而先要遍历左子树,所以此 结点应先进栈保存,当遍历完它的左子树后,再次回到该结点,还不能访问它, 还需先遍历其右子树,所以该结点还必须再次进栈,只有等它的右子树遍历完后, 再次退栈时,才能访问该结点。为了区分同一结点的两次进栈,引入一个栈次数 的标志,一个元素第一次进栈标志为0,第二次进栈标志为1,并将标志存入另一 个栈中,当从标志栈中退出的元素为1时,访问结点。日 43 后序遍历二叉树的非递归算法如下: void bitree::postorder1( bitree *root) bitree*p,*s1[100]; //s1栈存放树中结点 int s2[100],top=0,b; //s2栈存放进栈标志 p= do while(p!=NULL){s1[top]=p;s2[top++]=0; //第一次进栈标志为0 p=p->} //进入左子树 if(top>0) {b=s2[--top]; p=s1[top]; {s1[top]=p;s2[top++]=1;//第二次进栈标志为1 p=p->} //进入右子树 else {cout<data<0);}日 44 例如,可以利用上面介绍的遍历算法,写出如图6-11所示的二叉树的三种遍历序列为: 先序遍历序列:ABDGCEFH中序遍历序列:BGDAECFH 后序遍历序列:GDBEHFCA 图6-11 一棵二叉树 日 45 另外,在编译原理中,有用二叉树来表示一个算术表达式的情形。在一棵二叉树 中,若用操作数代表树叶,运算符代表非叶子结点,则这样的树可以代表一个算 术表达式。若按前序、中序、后序对该二叉树进行遍历,则得到的遍历序列分别 称为前缀表达式(或称波兰式)、中缀表达式、后缀表达式(或称逆波兰式)。具体参见图6-12。图6-12算术表达式a*b-c代表的二叉树 图6-12所对应的前缀表达式:-*abc。图6-12所对应的中缀表达式:a*b-c。图6-12所对应的后缀表达式:ab*c-。日 46 二叉树所对应的遍历序列可以通过递归算法得到,也可以通过非递归算法得到。但 有时要求直接写出序列,故我们可以用图6-13所示得到图6-12所示的遍历序列。从二叉树的三种递归遍历算法可知,三种遍历算法的不同之处在于访问根结点和遍 历左、右子树的顺序不同,若递归算法中去掉与递归无关的语句――访问根结点, 则三种遍历算法完全相同。于是对于二叉树的遍历,可以看成是从根结点出发,往 左子树走,若左子树为空,返回,再进入右子树,右子树访问完后,再返回根结点。这样一来每个结点都被访问三次,若将按顺序第一次访问的结点排列起来,则得到 该二叉树的先序序列,第二次访问的结点排列起来,则得到该二叉树的中序序列, 第三次访问的结点排列起来,则得到该二叉树的后序序列。图6-13中,第一次访问到的结点用表示,第二次访问到的结点用表示,第三次 访问到的结点用表示,按虚线顺序将所有排列起来,则得到先序序列为-*abc, 将所有排列起来,则得到中序序列为a*b-c,将所有排列起来,则得到后序序 列为ab*c-。日 47 图6-13三种遍历过程示意图 日 48 6.3.4 遍历算法应用举例 6.4线索二叉树 6.4.1 线索的概念 通过前面介绍的二叉树可知,遍历二叉树实际上就是将树中的所有结点排成一个 线性序列(即非线性结构线性化),在这样的线性序列中,很容易求得某个结点 在某种遍历下的直接前驱和后继。然而,有时我们希望不进行遍历就能快速找到 某个结点在某种遍历下的直接前驱和后继,这样,就应该把每个结点的直接前驱 和直接后继记录下来。为了做到这一点,可以在原来的二叉链表结点中,再增加两个指针域,一个指向 前驱,一个指向后继,但这样做将会浪费大量的存储单元,存储空间的利用率相 当低(一个结点中有4个指针,1个指左孩子,1个指右孩子,1个指前驱,1个指 后继),而原来的左、右孩子域有许多空指针又没有利用起来。日 49 为了不浪费存储空间,我们利用原有的孩子指针为空来存放直接前驱和后继,这 样的指针称为“线索”,加线索的过程称为线索化,加了线索的二叉树,称为线 索二叉树,对应的二叉链表称为线索二叉链表。在线索二叉树中,由于有了线索,无须遍历二叉树就可以得到任一结点在某种遍 历下的直接前驱和后继。但是,我们怎样来区分孩子指针域中存放的是左、右孩 子信息还是直接前驱或直接后继信息呢?为此,在二叉链表结点中,还必须增加 两个标志域ltag、rtag。ltag和rtag定义如下: lchild域指向结点的左孩子ltag= rchild域指向结点的右孩子rtag= rchild域指向结点在某种遍历下的直接后继日 50 这样,二叉链表中每个结点还是有5个域,但其中只有2个指针,较原来的4个指针 要方便。增加线索后的二叉链表结点结构可描述如下: lchild ltag data rtag rchild 另外,根据遍历的不同要求,线索二叉树可以分为: (1)前序前驱线索二叉树(只需画出前驱) (2)前序后继线索二叉树(只需画出后继) (3)前序线索二叉树(前驱和后继都要标出) (4)中序前驱线索二叉树(只需画出前驱) (5)中序后继线索二叉树(只需画出中序后继) (6)中序线索二叉树(中序前驱和后继都要标出) (7)后序前驱线索二叉树(只需画出后序前驱) (8)后序后继线索二叉树(中需画出后序后驱) (9)后序线索二叉树(后序前驱和后继都要标出) 日 51 6.4.2 线索的描述 1.结点数据类型的描述 class Hbitree public: int ltag , //左、右标志域 Hbitree *lchild, * 2.线索的画法在二叉树或二叉链表中,若左孩子为空,则画出它的直接前驱,若右孩子为空, 则画出它的直接后继,左右孩子都不为空时,无须画前驱和后继。这样就得到了 线索二叉树或线索二叉链表。日 52 例如,对于图6-15(a)所示的二叉树,图6-15为前序线索二叉树和二叉链表,图 6-16为中序线索二叉树和二叉链表,图6-17为后序线索二叉树和二叉链表。其中 虚线为指向前驱和后继的线索,实线为指向孩子的指针。NULLroot (a)二叉树(b)前序线索二叉树 (c)前序线索二叉链表 图6-15 前序线索示意图 日 53 NULLNULL root (a)中序线索二叉树(b)中序线索二叉链表 图6-16 中序线索示意图 NULLroot (a)后序线索二叉树(b)后序线索二叉链表 图6-17 后序线索示意图 日 54 从图6-15可知,线索二叉树的画法是:若左孩子(左子树)为空,直接画出指向它 在某种遍历下的前驱线索,非空时,不需要画出,若右孩子(右子树)为空,直接 画出指向它在某种遍历下的后继线索,右孩子非空时,不需要画出。另外,和单链表类似,线索二叉链表也可以带一个头结点,头结点的左孩子域指向 根结点,右孩子域指向该遍历的最后一个结点。例如,图6-16(b)所示的线索二 叉链表,加上头结点后如图6-18所示。root 图6-18带头结点的中序线索二叉链表 日 55 6.4.3 线索的算法实现 在此仅介绍中序线索二叉树的算法实现,设P为当前结点,pre为p的前驱结点,算 法描述如下: void Hbitree::inth (Hbitree //将P所指二叉树中序线索化,调用该函数之前,pre为NULL,而树中所有结点的ltag和rtag都为0 inth(p->lchild); //左子树线索化 if(p->lchild==NULL) p->ltag=1; (p->rchild==NULL)p->rtag=1; if(pre->rtag==1)pre->rchild=p; (p->ltag=1)p->lchild= pre=p;inth (p->rchild); //右子树线索化 日56 6.4.4 线索二叉树上的运算 1.线索二叉树上的查找 (1)查找指定结点在中序线索二叉树中的直接后继 若所找结点右标志rtag=1,则右孩子域指向中序后继,否则,中序后继应为遍历 右子树时的第一个访问结点,即右子树中最左下的结点(参见图6-19)。从图6- 19可知,X的后继为Xk。图6-19求中序线索二叉树中的直接后继示意图 日 57 求中序线索二叉树中的直接后继的算法描述如下: Hbitree *Hbitree::inordernext (Hbitree (p->rtag==1)q=p-> else q=p->while(q->ltag==0) q=q-> 日58 (2)查找指定结点在中序线索二叉树中的直接前驱 若所找结点左标志ltag=1,则左孩子域指向中序前驱,否则,中序前驱应为遍历 左子树时的最后一个访问结点,即左子树中最右下的结点(参见图6-20)。从图 6-20可知,X的前驱为Xk。图6-20求中序线索二叉树中的直接前驱示意图 日 59 求中序线索二叉树中的直接前驱的算法描述为: Hbitree *Hbitree::inordersucc(Hbitree (p->ltag==1)q=p-> else q=p->while (q->rtag==0) q=q->《数据结构与算法分析:C语言描述(原书第2版)》...问:本人C语言功底只是看完cpp那本书前面12章,编程练习都自己做过了!有比...答:额,我想你说的《数据结构与算法分析》应该是Weiss写的那本吧,那本书豆瓣给出了9分的评分,已经算是非常高的分数了,但计算机世界的经典著作犹如浩瀚的海洋,了不起的编程书籍还有很多。Kernighan的《程序设计实践》是让你全面了解编程该做些...数据结构要先学《离散数学》吗?问:有C语言基储想暑假回家闭关《数据结构》请问在数据结构要先学《离散数...答:我相信当你把这两门功课都学完后,会发觉最好的方式是先学《离散数序》再学《数据结构》,当然你硬要先学《数据结构》也是可以的。没有太大的影响。《计算机组成原理》应当在《汇编》之前学合适。
- Copyright & 2017 www.xue63.com All Rights Reserved

我要回帖

更多关于 递归是什么数据结构 的文章

 

随机推荐