版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《《数据结构》考研考点精讲及复习思《数据结构》考研分析与指导~、考试特点分1.在计算机专业入学统,作为专业课综合中的一个版块进行。在部分自主命题院校入学考试中有单独作为一个科目进行,也有和其他一门或者两门科目联合出题。2.出题形式多为选择题和综合应用3.侧重于基础知识点及对知识点灵活运用的考二、复习方1.分清复习的阶段,把握复习进2.亲手做题,在练习中总结出题方向和方法,重视,透彻分析,揣摩出题人心理。只有做好一定量的习题,才能帮助理解和牢固掌握考点。3.讲过的知识点和题彻底掌握并及时回顾,不要学过忘过。4.注重知识点之间的联系5.不可忽视基础概念和知识体系。但是同时还要做到重点突出,突破难点,查缺补漏三、考试内容及分值分布章重难必考考试题1.绪选2.线性√√√选择、综合分3.栈和队√√√选择、综合分4.√√选择、填5.数组和广义选择、填6.√√√选择、综合分7.√√√选择、综合分8.查√√√选择、综合分9.排√√√选择、综合分1四、章节知识点及题型分章知识题型题型易考1数据结构的定义、逻辑结的分类、算法的定义和杂度和物理结构法性能的选题逻辑结构和物理结构的和算法性能的复杂度分类、法的定义2性表的概念及运算性表的顺序性表的链式元多项式的表示相加选题1.线性表的定义和基2.线性表的顺序3.线性表的链式本运算综合析题1.线性表算法的设的定义和运的顺序和链选题1.栈和队列的定义和2.栈和队列的顺序运链式3栈队的应列的定义和运列的顺序和链列的应用式综合析题栈和队列的应用算4类型的定的顺序和链式的模式匹配算法选题1.串的定义和综合析题2.串的模式匹配算5组的定义和运算组的顺序殊矩阵的压缩义表选题数组和广义表的定义和矩阵的压缩的概念与定叉树的定义和结构选题树与二叉树的定义树、森林和二叉树的系结构6二叉树的遍历与线化、森林和二叉树的关夫曼树及其应用系综合析题哈夫曼树及其应选题图的定义和结图的定义与图的结构7的遍小生成扑排序和关键路径短路径综合析题最小生成树拓扑排序关键路径最短路2续章知识题题型易考选择查找的定义顺序查找1.查找基本概念折半查找82.基于静3.基于综合分题索二引叉顺排序序表树查找4.哈希的查找平衡二叉排序树B树哈希的解决9①排②交换排③选择排④归并排⑤基数排综合分题各种排序方法的应用3第一 绪~、考试分考重点与难考中常见题复习思路与方数逻、四综1.熟和物;练,结◦构二、考点讲数据结构是一门研究非数值计算的程序设计问题时处理的操作对象以及它们之间的关系和操作等等的学科。1.基本概·数据(Data)对客观事物的符号描述,能输入到计算机中并被计算机程序处理的符号的总称;能被计算机识别、和加工处理的信息的载体。字母:a~z,单词图、音频信号等表·数据元素(DataElement)数据元素是组成数据的基本单位,是数据集合的,在计算机中通常作为一个整体进行考虑和处理。例,“对弈树”中的一个格4书目信息中的一条书数据项:一个数据元素可由若干个数据项组成例,一条书目信息是由书名、作者名、分类等多个数据项组成的数据项是数据的不可分割的最小单位。例如:有一个学生表如下所示。这个表中的数据元素是学生记录,每个数据元素由四个数据(即学号、姓别、和班号)组成学班1张男8刘女李女陈男王男董男5王女·数据结构(Data数据结构是指相互之间存在一种或多种特定关系的数据元素集合结构(Structure):数据元素相互之间的关系。在形式上可用二元组表示:DataStructure=(D,D:数据元素的有限集S:D上关系的有限集D={ki|1≤n0ki示集合D中的第i个结点或数据元n为D中结点的个若n=0,则D是一个空集,表示D无结构可言,有时也可以认为它具有任意的结构S={rj|1≤mm0rj示集合S中的第j个二元关系(简称关系m为S中关系的个若m=0,则S是一个空集,表明集合D中的元结点间不存在任何关系,彼此是独立D上的一个关系r是序偶的集合,对于r中的任一序偶<x,y>(x,yD),称序偶的第一结点为第二结点的直接前驱结点(通常简称前驱结点),称第二结点为第一结点的直接后继结点(通常简称后继结点)。如在<x,y>的序偶中,x为y的前驱结点,而y为x的后继结点。若某个结点没有前驱,则称该结点为开始结点;若某个结点没有后继,则称该结点为终端结点;除此之外的节点称为节点“尖括号”表示有向关系,“圆括号”表示无向关系例如:用二元组表示学生表,学生表有7个结点,依次用k1~k7表示,则对应的二元组表示为:DataStructure=(D,S)其中:D={k1,k2,k3,k4,k5,k6,k7S={<k1,k2>,<k2,k3>,<k3,k4>,<k4,k5>,<k5,k6>,<k6,k7>逻辑结构图:可以将数据结构用图形形象地表示出来,图形中的每个结点对应着一个数据元素,两结点之间的连线对应着关系中的一个序偶。上述“学生表”数据结构用下图的图形表示2.数据结构的内逻辑结数据元间的关逻辑结构可看作是从具体问题抽象出来的数学模型按照逻辑关系的不同特性分类:逻辑结构类型的分(1)线性结所谓线性结构,该结构中的结点之间存在一对一的关系其特点是:开始结点和终端结点都是惟一的,除了开始结点和终端结点以外,其余结点都有且仅有一个前驱结点,有且仅有一个后继结点。顺序表就是典型的线性结构(2)非线性结所谓非线性结构,该结构中的结点之间存在一对多或多对多的关系。它又可以细分为树形结构和图形结构两类。所谓树形结构,该结构中的结点之间存在一对多的关系。其特点是每个结点最多只有一个前驱6但可以有多个后继,可以有多个终端结点。非线性结构树形结构简称为树UNIX文件系统的系统结构所谓图形结构,该结构中的结点之间存在多对多的关系。其特点是每个结点的前驱和后继的个数都可以是任意的。因此,可能没有开始结点和终端结点,也可能有多个开始结点、多个终端结点。图形结构简称为图。结构(物理结构)逻辑结构在计算机中的 映象,是逻辑结构在计算机中的实现,它包括数据元素的表示和关系的表示。顺序结非顺序结构(链式 结构)索引结构散列结例如:用顺序法和链式法表示下面的学生表学班1张男8刘女李女陈男王男董男5王女用顺序法存放学生表的结构体定义为7《《数据结构》考研考点精讲及复习思structStud/号///号///// charname[8];charsex[2]charclass[4] Studs[7]={1,“张斌”,“男”,“9901”}…{5,"王萍","女","9901"}结构体数组Studs各元素在内存中按顺序存放,即第i(1i6个学生对应的元素Studs[i]存放在第i+1个学生对应的元素Studs[i+1]之前,Studs[i+1]正好在Studs[i]之后。用链式法存放学生表的结构体定义为:typedefstructnode{int/号/charname[8]//charsex[2]charclass[4]/ 性别/ 指向下struct指向下}
学生的指针学生表构成的链表如下图所示。其中的head为第一个数据元素的指针链式法的缺点·空间占用无法随机8链式法的优点便于修改(、删除、移动)3.算法(1)算法(Algorithm)的定Algorithmisafinitesetofruleswhichgivesasequenceofoperationforsolvingaspecifictypeofproblem.(算法是规则的有限集合,是为解决特定问题而规定的一系列操作。)(2)算法的特①有穷性:有限步骤之内正常结束,不能形成无穷循环②确定性:算法中的每一个步骤必须有确定含义,无二义性③可行性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成④输入:有多个或0个输入⑤输出:至少有一个或多个输出在算法的五大特性中,最基本的是有限性、确定性和可行性。4.算法描述的工具描述算法的方自然语言:优 简单。缺 有歧异,表达复杂思想不明晰,不能方式很好结高级程序设计语言,如Pascal,C/C++,Java等。优点 克服了自然语言的缺点,可直接执行。缺点 对部分问题的描述比较烦杂, 类语言。和高级程序设计语言类似,但是对其中一些比较烦杂的部分进行和简化(原因:类举法主要目的是为了清晰的表述思想)例:两个数据a,b交换空举自然语言:交换a,b的空间高级语言:{x=a;a=b;b=x;}类语言:ab;//交换空间5.对算法作性能评衡量算法效率的方法主要有两大类事后统计:利用计算机的时钟事前分析估算:用高级语言编写的程序运行的时间主要取决于如下因素算法问题规模使用语言:级别越高,效率越低;编译程序;机器通常,从算法中选取一种对于研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法执行的时间度量。基本操作重复执行的次数分别为1,n,9设算法的问题规模为频度:语句重复执行的次数称为该语句的频度,记f(n)对算法各基本操作的频度求和,便可得算法的时间复杂度。但实际中所关心的主要是一个算法所花时间的数量级,即取算法各基本操作的最大频度数量级。时间复杂度:算法执行时间度量,记T(n)=O(axlevelf(n)))。f(n)=1+n+n2+n3T(n)=O(n3)O的数学定义:若T(n)和f(n)是定义在正整数集合上的两个函数,则如果存在正常数C和n得当n≥时,总满足0Tn)≤Cfn),则记做T(n)=O(f(n))也就是只求出T(n)的最高阶(数量级),忽略其低阶项和常系数,这样既可简化T(n)的计算,能比较客观地反映出当n很大时,算法的时间性能。6.算法的空间复杂度关于算法的空间需求,类似于算法的时间复杂度,采用空间复杂度作为算法所需空间的量度,记作:S(n)=O(f(n)三、举1.从逻辑结构上可以把数据结构分为( )两大类.【交通科技大学】A.动态结构、静态结构B.顺序结构、链式结C.线性结构、非线性结构D.初等结构、构造型结2.在下面的程序段中,对x的赋值语句的频度为( )【工商大学】FORi:=1TOnDOFORj:=1TOnx:=x+2A.O( B.O( C.O(n2 D.O(log23.以下属于逻辑结构的是 )【西安电子科技大学A.顺序 B.哈希 C.有序 D.单链四、本讲小本章讲解了数据、数据结构、算法的基本概念,数据的逻辑结构和物理结构。重点讲解了数据的4种逻辑结构和4种物理结构,以及算法复杂度。第二 线性分2. 线性表的概念及运算[一般了解2.2 线性表的顺序[熟练掌握]2. 线性表的链式[熟练掌握第1考重点与难考考重点与难考中常见题复习思路与方线性表的基本概念和常用线性表在常用操作、性表选择题、2.储掌握线性◦操作、线性表的顺序方式◦的顺序◦综合分析题二、考点讲2. 线性表的概念及运1.线性表的定—个线性表是具有n个数据元素的有限序列。2.线性表的长度
记为(a1,…,ai-aiai,…,an线性表中元素的个数n(n>=0),n=0时,称为空表
i个元素,称i为数据元素ai性表中的位序4.线性表的逻辑结例子英文字母表(A,B,…,Z)车辆登记表5.线性表的特同一性:线性表由同类数据元素组成,每一个ai须属于同一数据对象有穷性:线性表由有限个数据元素组成,表长度就是表中数据元素的个数有序性:线性表中相邻数据元间存在着序偶关系<ai,ai+1>。6.线性表的基本运算初始化InitList(L建立一个空表求表长ListLength(L)返回线性表的长度读表元素etEmL,i,e用e返回L中第i个数据元素的值定位LaeElemL,e,cme))返回满足关系的数据元素的位序ListInsert(Li,e)在L中第i个位置之前新的数据元素e,线性表的长度增1。删除ListDelete(Li,&e)删除L的第i个位置上的数据元素e,线性表的长度减1输出ListDisplay(L)按前后次序输出线性表的所有元素练习1:两个线性表LA和LB分别表示两个集合A和B,现求一个新的集合A=∪B。voidunion(ListaListLb){Lalen=ListLength(La);Lblen=ListLength(Lb)for(i=1;i<=Lblen;i++){tEmLb,i,e);if(!aeEmLa,e,equal))ListInsert(La,++Lalen,e);}}练习
O(ListLength(La)×ListLength(Lb)两个线性表LA和LB中的数据元素按值非递减有序排列,现将LA和LB归并为一个新的线性表,LC中的数据元素仍按值非递减有序排列。LA=(3,5,8,LB=(2,6,8,9,11,15,LC=(2,3,5,6,8,8,9,11,11,15,a,当a!bcb,当a>bvoMrgeitListLa,ListLb,List{InitList(Lc)Lalen=ListLength(La); Lblen=ListLength(Lb);i=j=1;k=0;while((i<=Lalen)&&(j<=Lblen))tEmLa,i,a);tEmLb,j,b)if(a<=b){ListInsert(Lc,++k,a);++i;}else{ListInsert(Lc,++k,b);++j;}}while(i<=Lalen)tEmLa,i++,a);ListInsert(Lc,++k,a);}while(j<=Lblen){tEmLb,j++,b);ListInsert(Lc,++k,b);}O(ListLength(La)+ListLength(Lb))例,La=(3,5,8),Lb=(2,6,8,9,15)构造Lc=(2,3,5,6,8,8,9,15)首先,Lalen=3;Lblen=5;2.2 线性表的顺序表示1.顺序表:按顺序方式构造的线性表假设线性表中有n个元素,每个元素占k个单元,第一个元素的地址为loc(a),则可以通过如下公式计算出第i个元素的地址loc(ai):loc(ai)=loc(a1)+(i-1)×k其中loc(a1)称为址。2.顺序表的特点逻辑结构中相邻的数据元素在结构中仍然相邻线性表的顺序结构是一种随机存取的结构。3.顺序表的描述:typedef{ElemType //当前长 listsize;//分配的容}//ElemTypeelem[Etypedef#Epe #为根据具体问题确定的数据类型typedefint 4.顺序表上基本运算的实初始化StatusInitListSq(SqList{L.elem=(ElemType)alc(LISTINITSIZEsizeof(ElemType));if(!L.exit(OELW;L.length=0;L.listsize=LISTINITreturn}L.elem=newElemType[LISTINITSIZE]顺序表的:在表中第4个元前“21“顺序表中元StatusListInsertSq(SqList&L,inti,ElemTypee){if((i<1)||(i>L.length+1))returnERROR;if(L.length>=L.listsize){realloc(…);….;//越界处理;}q=&(L.elem[i-1])for(p=&(L.elem[L.length-1];p>=q;--(p+1)=p;q=e;++L.length;n}//越界处if(L.length>=L.listsize newbase=(ElemType)realloc(L.elem(L.listsize+LISTINCREMENT)sizeof(ElemType))if(!newbase) exit(OVELW;L.elem=newbase;L.listsize+=LISTINCREMENT;算法时间复杂度:时间主要花在移动元素上,而移动元素的个数取决于元素位置。i=1,需移动n个元素;i=n+1,需移动0个元素i=i,需移动n-i+1个元素假设pi是在第i个元前一个新元素的概则长度为n的线性表 一个元素所需移动元素次数的期望Eis=∑pi(n-i+1)i设在任何位置元素等概率,n
=n+1 n+1(n-i+1)i n+i
O(顺序表的归并,表中元素非递减排列vidMergsSq(SqListLa,SqListLb,SqListc{pa=La.elem;pb=Lb.Lc.listsize=Lc.length=La.length+Lb.length;pc=Lc.elem=(ElemType)lc…);if(!Lc.elem)exit(OVLW;palast=La.elem+La.length-1;pblast=Lb.elem+Lb.length-1;while((pa<=palast)&&pb<=pblast)){if(pa<=pb) pc++=pa++;elsepc++= pb++;}while(pa<=palast)pc++=pa++;while(pb<=pblast) pc++=pb++;}顺序表的基础要点1.无需为表示元素间的逻辑关系而增加额外的空间,密度大(100%);2.可随机存取表中的任一元素。3.或删除一个元素时,需平均移动表的一半元素,具体的个数与该元素的位置有关,在等概率情况下,n/2,删除(n-1)/2;O(n)4.分配只能预先进行分配5.将两个各有n个元素的有序表归并为一个有序表,其最少的比较次数是:n练习2.29已知A、B、C为三个元素值递增有序的顺序表,现要求对A作如下运算,删去那些既在B中出现又在C中出现的元素,实现上述算法并分析时间复杂度。A=A-(A=(1,2,6,6,8,9,10,10,11,15)B=(1,2,6,6,7,9,10,15)C=(3,4,6,7,7,9,9,9,10,A=(1,2,8,11,15)分析:先从B和C中找出公有元素,记为eA中从当前位置开始,凡小于same的元素均保留(存到新的位置),等于same的跳过大于same时就再找下一个voidSqListIntersectDelete(SqListASqListB,SqList pa=A.elem;palast;pb;pblast;pc;pclast;while((pa<=palast)&&(pb<=pblast)&&(pc<=pclast)){if(pb<pc) pb++;else{
pc++same=while((pb<=pblast)while((pc<=pc
&&(pb==ae&&(pc==me
pb++;pc++while((pa<=palast)&&(pa<me)p0++= pa++;}//
while((pa<=pa
&&(pa==ae pa++}//while(pa<=pap0++= A.length=p0"A.elem;}三、举1.下面关于线性表的叙述中,错误的是哪一个?( )【北方交通大学】A.线性表采用顺序,必须占用一片连续的单元。B.线性表采用顺序,便于进行和删除操作C.线性表采用,不必占用一片连续的单元。D.线性表采用,便于和删除操作。2.若长度为n的线性表采用顺序结构,在其第i个位置一个新元素的算法的时间复杂为 )(1<=i<=n+1)。【航空航天大学A.O( B.O( C.O( D.O(n2四、本讲小本讲主要讲解了:线性表的基本概念和常用操作、线性表的顺序方式。常考题型:选择题,综合分析题。应试方法:理解并熟练掌握线性表的顺序方式和线性表的基本运算在现行方式下在实现方法。第2~、考试分考重点与难考试中常见题复习思路与方线性表的链式结构◦综◦式存二、考点讲2.3 线性表的链式表示线性表链式结构的特点:用一组任意的单元线性表的元素,不要求逻辑上相邻的元素在物理位置上也相邻删除时不需移动大量元素;失去顺序表可随机存取的优点。例,整数数组a[3]={3,5,6}1.线性链表(单链表结点:数据元素的映象数据域用来结点的值指针域用来数据元素的直接后继的地址(或位置)头指指示链表中第一个结点的位置,单链表可由头指针唯一确定单链表的映头结在链表的第一个结点之前附设一个结点,头指针指向头结点。设置头结点的目的是空表与非空表的操作,简化链表操作的实现。首元结链表中线性表中第一个数据元素的结点链表结构描述:TypedefstructLNode{ElemTypestruct 单链表基本运算实现(1)初始化线性表InitList(该运算建立一个空的单链表,即创建一个头结点。voidInitList(LinkListL){L=(LinkList)csizeof(LNode))创/创/L->next=}
建头结(2)销毁线性表DestroyList(单链表L占用的内存空间。即逐一全部结点的空间。《《数据结构》考研考点精讲及复习思voidDestroyList(LinkList{LinkListp=L,q=p->next;while(q!=NULL) free(p)p=q;q=p->}free(p)}(3)判线性表是否为空表ListEmpty(若单链表L没有数据结点,则返回真,否则返回假。intListEmpty(LinkListL){return(L->next==NULL)}(4)求线性表的长度ListLength(L)返回单链表L中数据结点的个数。intListLength(LinkListL){LinkListp=L;inti=0;while(p->next!=NULL){i++p=p->}return(i)}(5)输出线性表DispList(逐一扫描单链表L的每个数据结点,并显示各结点的data域值。voidDispList(LinkListL){LinkListp=L->next;while(p!=NULL) printf("%c",p->data);p=p->next;}printf("\n")}(6)取表元StatustEmLinkListL,inti,ElemType{p=L->next;j=1;while(p&&j<i){p=p->next;++}if(!p||j>i)returnERROR;e=p->data;return}例,取第i=3个元素e=p->data=Sun时间复杂度:O(n)·在单链表第i个结点前一个结点的过(7)StatusListInsert(LinkList&L,inti,ElemType{p=L;j=while(p&&j<i-1){p=p->next;++j}if(!p||j>i-1) returnERROR;s= (LinkList)csizeof(LNode));s->data=e;s->next=p->next;p->next=s;return}·删除单链表的第i个结点的过(8)删StatusListDelete(LinkListLinti,ElemType{p=L;j=while(p->next&&j<i-1){p=p->next;++j}if(!(p->next)||j>i-1)returnERROR;r=p->next;e=r->p->next=p->next-next;//(p->next=r->next;)free(r);returnOK;}·动态建立单链表的过(9)头插法建CreateListH(LinkListLint{L=(LinkList)csizeof(LNode));L->next=NULL;for(i=n;i>0;--i)s=(LinkList)csizeof(LNode));scanf(&s->data);s->next=L->next;L->next=s;}}·法建(10)法建CreateListT(LinkListLint{tail=L=(LinkList)csizeof(LNode));L->next=NULL;for(i=n;i>0;--i)s=(LinkList)csizeof(LNode));scanf(&s->data);s->next=NULL;tail->next=s;①tail=s;}}(11)按元素值查找ateEmL,思路:在单链表L中从头开始找第1个值域与e相等的结点,若存在这样的结点,则返回位置,否则返回0。intoaeEmLinkListL,ElemType{LinkListp=L->next;intn=1;while(p!=NULL&&p->data!= p=p->next;n++; if(p==NULL) return(0);elsereturn(n)}练习:已知L是结点的非空单链表,指针p所指的结点既不是第一个结点,也不是最后一个结点。删除 p结点的直接后继结点的语句序列q=p->next;p->next=q->next;free(q);删除 p结点的直接前驱结点的语句序列q=L;while(q->next->next!=p) q=q->next;s=q->next;q->next=p;free(s);删除 p结点的语句序列q=L;while(q->next!=p) q=q->next;q->next=p->next;free(p)删除首元结点的语句序列q=L->next;L->next=q->next;free(q);删除最后一个结点的语句序while(p->next->next!=NULL) p=p->next;q=p->next;p->next=NULL;free(q);链式结构的特点非随机存贮结构,所以取表元素要慢于顺序表。节约了大块内存适合于和删除操实际上用空间换取了时间,结点中加入了指针,使得这两种操作转换为指针操作;2.静态链表有些高级程序设计语言并没有指针类型,如FORTRAN和JAVA。可以用数组来表示一个链表,称为静态链表。可定义如下#defineMAXSIZE //最多元素个数typedefstruct{ElemType cur;//游标,指示}pentSLinkList[XEi=s[i].cur;指针后移操lci=s[0].cur;第一个可用结点位if(s[0]. s[0].cur=s[i]. //k结s[k].cur=s[0].cur;[0].cur=Insert://将i插在r之s[i].cur=s[r].cur;s[r].cur=i;Delete:;//p为k的直接前驱,s[p].cur=s[k].curFree(k);单链表基础要点在单链表中,不能从当前结点出发到任一结点在单链表中,删除某一指定结点时,必须找到该结点的前驱结点线性表的链式结构是一种顺序存取的结构,不具有随机任一元素的特点设置头结点的作用:使在链表的第一个位置上的操作和表中其它位置上的操作—致,无需进行特殊处理,对空表和非空表的处理。循环链表循环链表是另一种形式的链式结构可从当前结点出发,到任一结点循环单链表多重循环链表。单循环链表设置尾指针rear,比设头指针更好连接两个只设尾指针的单循环链表L1和L2操作如下:p=R1">next;//保存L1的头结点指针R1->next=R2->next->next;//头尾连接free(R2->next);//第二个表的头结R2->next=操作与线性单链表基本一致,差别只是在于算法中的循环结束条件不是p是否为空,而是p是否等于头指针。例:取循环链表第i个元素StatusGetElemL( &e p=L->next;j=1while(p!=L&& j<i) p=p->next;++j;}if(p==L||j>i)returnERROR;e=p->data;return}双链表希望查找前驱的时间复杂度达到O(1),可以用空间换时间,每个结点再加一个指向前驱的指针域,使链表可以进行双方向查找。用这种结点结构组成的链表称为双向链表。结点的结构图双向链表的逻辑表示双向链表(DoubleLinkedList)类型描述typedefstructstructDuLNode
struct } 双向循环链p->next->prior=p->prior->·双向链表的前(后 操①s->prior=p-> ②p->prior->next=③s->next= ④p->prior=①s->next=q-> ②q->next->prior=③s->prior= ④q->next=双向链表的删除操①p->prior->next=p->②p->next->prior=p->删除 p的直接后继结点的语句序列q=p->next;p->next=p->next->next;p->next->prior=p;free(q)删除 p的直接前驱结点的语句序列q=p->prior;p->prior=p->prior->prior;p->prior->next=p;free(q)《《数据结构》考研考点精讲及复习思return}②找结点的中序后继结结点p,无右孩子,右指针指向其后继,否则p的右子树中“最左下”结点。BiThrTreePostNode(BiThrTreep){post=p->if(p->RTag==0)//有右孩子while(post->LTag==0)post=post->lchild;return}结点的线索二叉链表结点的中序线索二叉链表中序遍历线索二叉树 //0:有孩子;1:无孩子VoidInOrderTraverseThr(BiThrTree {p=T->lchild;while(p!=T)while(p->LTag==0)p=p->lchild;cout<<p->data<<“”;while((p->RTag==1)&&(p->rchild!=T) p=p->rchild;cout<<p->data<<“”;}p=p->}}建立线索化链表(以中序为例按某种次序将二叉链表线索化,实质是在遍历过程中用线索取代空指针对线索树进行遍历,显然其效率要比传统方式高些。如果程序中经常要进行二叉树的遍历或者需要查找在遍历过程中所的线性序列中前驱和后继,此时应当采用线索链表表示。6. 树和森1.树的结构(三种方法双亲表示法:用一组连续的空间来树中的结点,在保存每个结点的同时附设一个指示器来指示其双亲结点在表中的位置,其结点的结构如下:树的双亲结构示意#defineMAXTREESIZE100typedefstructPTNode{TElem }PTNode;Typedefstruct{PTNodenodes[MAXTREESIZE] r, //根的位置和结点}双亲表示法的类型说明孩子表示法①定长结点长空链域个数:nk"(n)=n(k-1)+②把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。n个结点共有n个孩子链表(叶子结点的孩子链表为空表),而n个结点的数据和n个孩子链表的头指针又组成一个顺序表typedefstructCTNode{/孩子结点的定义 structCTNode}
该孩子结点性表中的位置/typedefstruct{TElemTypedata;
/顺序表结点的结构定 指 结点的信息指 FirstChild;}
向孩子链表的头指 树typedefstruct{ 的定 树顺 nodes[MAXTREESIZE]; 序 顺根introot,num;根/}结孩子兄弟表示法typedefstructCSNode{ElemTypedata; 结
结点的位置和树的结点个数第点信 第StructCSNodeFirstChild,NextSibling;}
—个孩子,下一个兄弟树树的孩子兄弟结构示意2.树、森林与二叉树的相互转·树转换为二叉(1)在所有相邻兄弟结点之间加一水平连线(2)对每个非叶结点k,除了其最左边的孩子结点外,删去k与其他孩子结点的连线(3)所有水平线段以左边结点为顺时针旋转45度,使之结构层次分明。树做这样的转换所构成的二叉树是唯一的。树与二叉树的对·森林转换为二叉森林也可以方便地用孩子兄弟链表表示。森林转换为二叉树的方法如下(1)将森林中的每棵树转换成相应的二叉树(2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连在一起后,所得到的二叉树就是由森林转换得到的二叉树。·二叉树还原为树或森将一棵二叉树还原为树或森林,具体方法如下《《数据结构》考研考点精讲及复习思(1)若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子……都与该结点的双亲结点用线连起来。(2)删掉原二叉树中所有双亲结点与右孩子结点的连线(3)整理由(1)、(2)两步所得到的树或森林,使之结构层次分明二叉树到森林的转换示3.树与森林的遍·树的遍历(两种1)先根遍若树非空,则遍历方法为①根结点②从左到右,依次先根遍历根结点的每一棵子树。等同于转换的二叉树进行先序遍历先根遍历序列ABECFHGD2)后根遍历若树非空,则遍历方法为①从左到右,依次后根遍历根结点的每一棵子树②根结点等同于转换的二叉树进行中序遍历后根遍历序列为EBHFGCDA·森林的遍历(2种1)中序遍若森林非空,则遍历方法为①森林中第一棵树的根结点②先序遍历第一棵树的根结点的子树森林③先序遍历除去第一棵树之后剩余的树构成的森林。先序遍历序列为ABCDEFGHIJ等同于转换的二叉树进行先序遍历2)先序遍历若森林非空,则遍历方法为①中序遍历森林中第一棵树的根结点的子树森林②第一棵树的根结点③中序遍历除去第一棵树之后剩余的树构成的森林。中序遍历序列为 等同于转换的二叉树进行中序遍历4.几个问题①给定树的先根遍历序列和后根遍历序列可唯一画出一棵树。先根遍历序列:ABECFHGD后根遍历序列:EBHFGCD②给定森林的先序遍历序列和中序遍历序列可唯一确定一森林。先序遍历序列:ABCDEFGHIJ中序遍历序列:BCDAFEHJI③关于二叉树的先序、中序和后序遍历序列确定二叉树的问题·任何n(n0个不同结点的二叉树,都可由它的中序序列和先序序列唯一地确定证明先序序列是a1a2…an中序序列是b1b2…bn根结点:a在中序序列中与a同的结点为:bj{b1…bj-1}bj{bj+1…bn}←→a1{a2…ak}{ak+1…an例已知先序序列为ABDGCEF,中序序列为·任何n(n>0)个不同结点的二叉树,都可由它的中序序列和后序序列唯一地确定。证明:后序序列是a1a2…an中序序列是b1b2…bn根结点:an在中序序列中与an同的结点为:bj{b1…bj-1}bj{bj+1…bn}←→a1a2…ak}{ak+1…an-1}an例后序序列为GDBEFCA,中序序列为DGBAECF6.5树与等价问离散数学中的定等价关系:若集合S中的关系R是自反的、对称的和传递的,则称为等价关系等价类:R是集合S的等价关系,由[x]R={y|y∈S∧y给出的集合[x]R称为由x生成的一个R等价类。划分:R是S上的等价关系,可以按R将S划分为若干不相交的子集……,它们的并即为S,则这些子集Si是S的R等价类。如何划分等价类假设集合S有n个元素,m个形如(x,y)的等价偶对确定了等价关系R,求S的划分。一种算法:1)令S中每个元素各自形成一个只含单个成员的子集,记为…,Sn2)重复读入m个偶对,对每个偶对(x,y),判断x和y所属的子集,设x∈S,y∈S,若SiS,则将Sj入Si并置Sj空。处理完m个偶对后剩下的非空子集就是S的R等价类。划分等价类需要的操作:1)构造只含单个元素的集合2)判定某个元素所属集合3)合并两个互不相交的集FSt若S是FSe类型的集合,则它由子集Si构成,∪…S=S。基本操作:Initial(&S,n,x1,x…,xn):构造由n个子集构成的集合S,每个子集只含单个元素。Find(S,x):查找x所属的子集Siee&S,i,j):合并两个不相交的集合SiSje类型的实现根据Find和Merge两个操作的特点,用树来实现Set以森林F=(…,Tn)表示Se类型的集合S,每颗树Ti示一个子集Si树中每个结点表示子集中的一个成员x令每个结点中包含一个指向其双亲的指针约定根结点兼作子集的名称集合的合并将一棵树的根指向另一颗树的根#defineMAXTREESIZE100typedefstructPTNode{TEl }PTNode;Typedefstruct{PTNodenodes[MAXTREESIZE];intr,n; //根的位置和结点数}TypedefPTreeStintfindmfset(MFSetS,int{if(i<1||i>S.n)return-for(j=i;S.nodes[j].parent>0;j=S.node[j]. return}Statusmergemfset(MFSetSinti,int{if(i<1||i>S.n||j<1||j>S.n)returnERROR;S.node[i].parent=j;return}时间复杂度分别为O(d)和O(1),d为树的深(7)掌握线索二叉树的概念和相关算法的实现(8)掌握哈夫曼树的定义、哈夫曼树的构造过程和哈夫曼编码产生方法(9)灵活运用二叉树这种数据结构解决一些综合应用问题二、举1.已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果 )【浙江大学A. B. C. D.不2.已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历是( 大学】A. B. C. D.3.一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是( )【合肥工业大学】A.不确定 B.0 C.1 D.24.若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为( 大学】A.X的双 B.X的右子树中最左的结C.X的左子树中最右结 D.X的左子树中最右叶节5.设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有( )个。【西安电子科技大学】A.n- B. C.n+ D.n+三、本讲小线索二叉树的概念和相关算法的实现。树、森林与二叉树的关系树的简单应第3~、考点讲情况:改进方法Merge时,总是将成员少的子集根结点指向含成员多的子集的修改结构,令根结点的parent域子集中所含成员数目的负可以将findmfset的复杂度降到O(logn)Statusmixmfset(eSinti,intj){if(i<1||i>S.n||j<1||j>S.n)returnif(S.nodes[i].parent>S.nodes[j].parent){S.nodes[j].parent+=S.nodes[i].parent;S.nodes[i].parent=}S.nodes[i].parent+=S.nodes[j].parent;S.nodes[j].parent=i;}return}进一步的改进:Find时压缩路当所查元素不在第二层时,将所有从根到该元素路径上的元素都变成根结点的孩子intfixmfset(MFSetSinti){if(i<1||i>S.n)return-for(j=i;S.nodes[j].parent>0;j=S.node[j].parent) for(k=i;k! =j;k=t){t=S.nodes[k]. S.nodes[k].parent=}return}6.6 哈夫曼树及其应用1.哈夫曼树①路径长从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称做路径长度。②树的路径长从树根到每一结点的路径长度之和③结点的权和带权路径长给树的每个结点赋予一个具有某种实际意义的实数,称该实数为这个结点的权。在树形结构中,把从树根到某一结点的路径长度与该结点的权的乘积,叫做该结点的带权路径长度。④树的带权路径长度WPL(WeightPathLengthofTree)树中所有叶子结点的带权路径长度之和,通常记为:wn∑WPLwn∑k1kLa)=7×2+5×2+2×2+4×2=36Lb)=4×2+7×3+5×3+2×1=46Lc)=7×1+5×2+2×3+4×3=35⑤哈夫曼树(最优二叉树设二叉树具有n个带权值的叶子结点,那么从根结点到各个叶子结点的路径长度与相应结点权值的乘积的和,叫做二叉树的带权路径长度。具有最小带权路径长度的二叉树称为哈夫曼树2.构造哈夫曼树(哈夫曼算法1)由给定的n个权值{...,Wn},构造n棵只有一个叶子结点的二叉树,从而得到一个二2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和;3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中;4)重复(2)、(3)两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。给定权值w=(1,3,5,7)来构造一棵哈夫曼树3.哈夫曼编码1)编码例,传送ABACCD,四种字符,可以分别编码为00,01,10,11。则原电文转换为000100101011。对方接收后,采用二位一分进行译码当然,为电文编码时,总是希望总长越短越好如果对每个字符设计长度不等的编码,且让电文中出现次数较多的字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国合成特种纤维织物行业竞争动态与销售前景预测报告
- 门诊导医知识培训
- 单片机课程学习小结
- 公司职业规划模板
- 扶梯救援行动预案
- 天然气泄漏应急处理方案
- 第9课 这是我的家 第一课时 课件(内嵌音视频)2025-2026学年道德与法治一年级下册统编版
- 集体主义教育主题班会
- 2025年吉林松原市初二学业水平地生会考考试题库(附含答案)
- 打工小伙职业规划视频
- 2026四川德阳市什邡市教育和体育局选调高(职)中教师13人备考题库附答案详解
- 2026江西赣州市安远县东江水务集团有限公司第一批人员招聘10人备考题库含答案详解(b卷)
- 企业一般固废管理制度
- 2026年花样滑冰赛事品牌建设与营销创新案例研究
- 北师大版数学七年级下册知识点归纳总结
- 电梯井整体提升搭设安全专项施工方案(完整版)
- 项目RAMS系统保证计划SAP
- 《2020室性心律失常中国专家共识(2016共识升级版)》要点
- 人教A版(2019)高中数学必修第二册 基本立体图形 第2课时圆柱、圆锥、圆台、球与简单组合体的结构特征课件
- 国家开放大学《四史通讲》形考任务专题1-6自测练习参考答案
- 混凝土机械建筑施工机械
评论
0/150
提交评论