1、11数据结构习题答案 2第一节 概 论 2第二节 线性表 5第三节 栈和队列 16第五节 树 19第七节 查找 25第八节 排序 29操作系统练习题参考答案 3222数据结构习题答案第一节 概 论一、选择题1要求同一逻辑结构的所有数据元素具有相同的特性,这意味着( )。A数据元素具有同一的特点 B不仅数据元素包含的数据项的个数要相同,而且对应数据项的类型要一致 C每个数据元素都一样 D数据元素所包含的数据项的个数要相等2数据结构是一门研究非数值计算的程序设计问题中计算机的( (1) )以及它们之间的( (2) )和运算的学科。(1) A操作对象 B计算方法 C逻辑存储 D数据映像(2) A结构
2、 B关系 C运算 D算法3数据结构被形式地定义为(D,R),其中 D 是( (1) )的有限集合,R 是 D 上( (2) )的有限集合。(1) A算法 B数据元素 C数据操作 D逻辑结构(2)A操作 B映像 C存储 D关系4在数据结构中,从逻辑上可以把数据结构分为( )。A动态结构和静态结构 B紧凑结构和非紧凑结构 C线性结构和非线性结构 D内部结构和外部结构5线性表的顺序存储结构是一种( )的存储结构。A随机存取 B顺序存取 C索引存取 DHash 存取6算法分析的目的是( )。A找出数据结构的合理性 B研究算法中的输入和输出的关系 C分析算法的效率以求改进 D分析算法的易懂性和文档性7计
3、算机算法指的是( (1) ),它必须具备输入、输出和( (2) )等五个特征。(1) A计算方法 B排序方法 C解决某一问题的有限运算序列 D调度方法(2) A可行性、可移植性和可扩充性 B可行性、确定性和有穷性 C确定性,有穷性和稳定性 D易读性、稳定性和安全性8线性表若采用链表存储结构,要求内存中可用存储单元的地址( )。A必须是连续的 B部分必须是连续的 C一定是不连续的 D连续不连续都可以9在以下的叙述中,正确的是( )。A线性表的线性存储结构优于链式存储结构 B二维数组是它的每个数据元素为一个线性表的线性表 C栈的操作方式是先进先出 D队列的操作方式是先进后出10根据数据元素之间关系
4、的不同特性,以下四类基本的逻辑结构反映了四类基本的数据组织形式,其中解释错误的是( )。A集合中任何两个结点之间都有逻辑关系但组织形式松散 B线性结构中结点按逻辑关系依次排列形成一条“锁链” C树形结构具有分支、层次特性,其形态有点像自然界中的树 D图状结构中的各个结点按逻辑关系互相缠绕,任何两个结点都可以邻接11以下说法正确的是( )。A数据元素是数据的最小单位 B数据项是数据的基本单位 C数据结构是带有结构的各数据项的集合 D数据结构是带有结构的数据元素的集合33二、判断题1数据元素是数据的最小单位。2数据结构是带有结构的数据元素的集合。3数据结构、数据元素、数据项在计算机中的映像分别称为
5、存储结构、结点、数据域。4数据项是数据的基本单位。5数据的逻辑结构是指各数据元素之间的逻辑关系,是用户按使用需要建立的。6数据的物理结构是数据在计算机中实际的存储形式。7算法和程序没有区别,所以在数据结构中二者是通用的。8顺序存储结构属于静态结构,链式存储结构属于动态结构。三、填空题1所谓数据的逻辑结构指的是数据元素之间的_逻辑关系_。2,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,它包括三方面的内容_数据的逻辑结构、数据的存储结构、对数据施加的操作_。3数据的逻辑结构包括_集合结构_、_线性结构_、_树型结构_和_图状结构_四种类型。4在线性结构中,开始结点_没有_前驱结点,其
6、余每个结点有且只有_一个_个前驱结点。5在树形结构中,根结点只有_一个_,其余每个结点有且只有_一个_前驱结点;叶结点没有_后继_结点,其余每个结点的后继结点可以有_任意个_6在图形结构中,每个结点的前驱结点和后继结点可以有_任意个_。7算法的五个重要特性是_可行性_、_确定性_、_有穷性_、_输入_、_输出_。8下列程序段的时间复杂度是_O(n)_。for (i=1;i,画出这个逻辑结构的图示,并确定相对于关系 R,哪些结点是开始结点,哪些结点是终端结点?答:图略。开始结点 k1、k2,终端结点 k6、k7。7设有如图 1.1 所示的逻辑结构图,给出它的逻辑结构,并说出它是什么类型的逻辑结构
7、。答:数据逻辑结构为:D=k1,k2,k3,k8,R=,其逻辑结构类型为树型结构。8分析下列程序的时间复杂度(设 n 为正整数)。(1)int rec(int n)if(n=1)return(1); else return(nrec(n-1); (2)x=91;y=100;While (y0) if(x10) y-;(3)i=1;j=0;while(i+jj)j+; else i+;(4)x=n;y=0;while(x=(y+1)(y+1) y+;答:(1) O(n) (2) O(1) (3) O(n) (4) O(n1/2)559设 n 为正数。试确定下列各程序段中前面加记号的语句的频度:(
8、1)i=1;k=0;while(inext=NULL Chead-next=head Dhead!=NULL10非空单循环链表 head 的尾结点p 满足( )。Ap-next=NULL Bp=NULL Cp-next=head Dp=head11在双循环链表的p 结点之后插入s 结点的操作是( )。Ap-next=s;s-prior=p;p-next-prior=s;s-next=p-next; Bp-next=s;p-next-prior=s;s-prior=p:s-next=p-next; Cs-prior=p;s-next=p-next;p-next=s;p-next-prior=s;
9、 Ds-prior=p;s-next=p-next;p-next-pror=s;p-next=s;6612. 在一个单链表中,已知q 结点是p 结点的前驱结点,若在q 和p 之间插入结点s,则执行( )。As-next=p-next;p-next=s; Bp-next=s-next;s-next=p; Cq-next=s; s-next=p; Dp-next=s; s-next=q;13. 在一个单链表中,若p 结点不是最后结点。在p 之后插入结点s,则执行( )。As-next=p;p-next=s; Bs-next=p-next;p-next=s;Cs-next=p-next; p=s;
10、Dp-next=s; s-next=p;14. 若某线性表中最常用的操作是取第 i 个元素和找第 i 个元素的前驱元素,则采用( )存储方式最节省时间。A顺序表 B. 单链表 C双链表 D单循环链表15设 rear 是指向非空带头结点的单循环链表的尾指针,则删除表头结点的操作可表示为( )。Ap=rear;rear=rear-next; free(p) Brear=rear-next;free(rear); Crear=rear-next-next; free(rear); Dp=rear-next-next;rear-next-next=p-next;free(p);16在一个单链表中,若删
11、除p 结点的后继结点,则执行( )。Aq=p-next;p-next=q-next;free(q); Bp=p-next;p-next=p-next-next;free(p); Cp-next=p-next;free(p-next); Dp=p-next-next;free(p-next);17设指针 p 指向双链表的某一结点,则双链表结构的对称性可用( )式来刻画。Ap-prior-next-=p-next-next Bp-prior-prior=p-next-prior Cp-prior-next-=p-next-prior Dp-next-next=p-prior-prior18在循环链
12、表中,将头指针改设为尾指针 rear 后,其头结点和尾结点的存储位置分别是( )。Arear 和 rear-next-next Brear-next 和 rear Crear-next-next 和 rear Drear 和 rear-next19循环链表的主要优点是( )。A不再需要头指针了 B已知某个结点的位置后,容易找到它的直接前驱 C在进行插入、删除操作时,能更好地保证链表不断开 D从表中任一结点出发都能扫描到整个链表20在线性表的下列存储结构中,读取元素花费时间最少的是( )。A单链表 B双链表 C循环链表 D顺序表二、判断题1顺序存储的线性表可以随机存取。2顺序存储的线性表的插入和
13、删除操作不需要付出很大的代价,因为平均每次操作只有近一半的元素需要移动。3线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。4在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上不一定相邻。5在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。6在单链表中,可以从头结点开始查找任何一个元素。7线性表的链式存储结构优于顺序存储结构。8在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。9在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。10顺序存储方式只能用于存储线性
14、结构。三、填空题1为了便于讨论,有时将含 n(n0)个结点的线性结构表示成(a1,a2,an),其中每个 ai 代表一个_结点_。a1 称为_第一个_结点,an 称为_最后一个_结点,i 称为 ai 在线性表中的_位置77_。对任意一对相邻结点 ai、ai+1(1inext;p-next=q-next;free(q);_6非空的单循环链表 head 的尾结点(由指针 p 所指)满足_ p-next= head _。7rear 是指向非空带头结点的单循环链表的尾指针,则删除起始结点的操作可表示为_ p=rear-next;q=p-next;p-next=q-next;free(q);_。8对于一
15、个具有 n 个结点的单链表,在 p 所指结点后插入一个结点的时间复杂度为_O(1)_,在给定值为 x 的结点后插入新结点的时间复杂度为_ O(n)_。9单链表表示法的基本思想是用_指针_表示结点间的逻辑关系。10在顺序表中插入或删除一个元素,平均需要移动_一半_元素,具体移动的元素个数与_元素的位置_有关。11在一个长度为 n 的向量的第 i(1in+1)个元素之前插入一个元素时,需向后移动_ n-i+1_个元素。12在一个长度为 n 的向量中删除第 i(1in)个元素时,需向前移动_ n-i _个元素。13在双链表中,每个结点有两个指针域,一个指向_前驱_,另一个指向_后继_。14在一个带头
16、结点的单循环链表中,p 指向尾结点的直接前驱,则指向头结点的指针 head 可用p 表示为 head=_ p-next-next ;_。15设 head 指向单链表的表头,p 指向单链表的表尾结点,则执行 p-next=head 后,该单链表构成_单循环链表_。16在单链表中,若 p 和 s 是两个指针,且满足 p-next 与 s 相同,则语句 p-next=s-next 的作用是_删除_s 指向的结点。17设 r 指向单循环链表的最后一个结点,要在最后一个结点之后插入 s 所指的结点,需执行的三条语句是_s-next= r-next _;r-next=s;r=s;18在单链表中,指针 p
17、所指结点为最后一个结点的条件是_ p-next=NULL_。19在双循环链表中,若要在指 p 所指结点前插入 s 所指的结点,则需执行下列语句:s-next=p; s-prior=p-prior;_ p-prior-next _=s;p-prior=s;20在单链表中,若要在 p 所指结点之前插入 s 所指的结点,可进行下列操作:s-next=_ p-next _; p-next=s; temp=p-data;p-data=_ s-data _; s-data=_ temp _;四、应用题1描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。答:首元结点是指链表中存储的线性表中
18、的第一个数据元素的结点。为了操作方便,通常在链表的首元结点之前附设一个结点,称为头结点。头指针是指向链表中的第一个结点的指针。2何时选用顺序表,何时选用链表作为线性表的存储结构为宜?答:从空间上来看,当线性表的长度变化较大、难以估计其规模时,选用动态的链表作为存储结构比较合适,但链表除了需要设置数据域外,还要额外设置指针域,因此当线性表长度变化不大、易于事先确定规模时,为了节约存储空间,宜采用顺序存储结构。从时间上来看,若线性表的操作主要是查找,很少进行插入和删除操作时,应选用顺序表。对于频繁进行插入和删除操作的线性表,宜采用链表作为存储结构。3在顺序表中插入和删除一个结点需平均移动多少个结点
19、?具体的移动次数取决于哪两个因素?88答:平均移动表中大约一半的结点,插入操作平均移动 n/2 个结点,删除操作平均移动(n-1)/2 个结点。具体移动的次数取决于表长和插入、删除的结点的位置。4为什么在单循环链表中设置尾指针比设置头指针更好?答:单循环链表中无论设置尾指针还是头指针都可以遍历表中任一个结点,但设置尾指针时,若在表尾进行插入或删除操作可在 O(1)时间内完成,同样在表头进行插入或删除操作也可在 O(1)时间内完成。但若设置的是头指针,表尾进行插入或删除操作,需要遍历整个链表,时间复杂度为O(n)。5双链表和单循环链表中,若仅知道指针 p 指向某个结点,不知道头指针,能否将结点p
20、 从相应的链表中删除?若可以,其时间复杂度各为多少?答:能删除。双链表上删除 p 所指向的结点的时间复杂度为 O(1),单循环链表上删除 p 所指向的结点的时间复杂度为 O(n)。6下列算法的功能是什么?LinkList testl(LinkList L)/L 是无头结点的单链表ListNode q,p;if(Lwhile(p-next) p=p-next;p-next=q; q-next=NULL;return L;答:如果长度大于 1,则将首元结点删除并插入到表尾。7如果有 n 个线性表同时共存,并且在处理过程中各表的长度会发生动态变化,线性表的总长度也会自动地改变。在此情况下,应选择哪一
21、种存储结构?为什么?答:应选用链式存储结构。因为顺序表是静态存储结构,只能预先分配,不能随着线性表长度的改变而变化。而链表则可根据需要动态地申请空间,因此适用于动态变化表长的线性表。8若线性表的总数基本稳定,且很少进行插入、删除操作,但要求以最快的方式存取线性表的元素,应该用哪种存储结构?为什么?答:应选用顺序存储结构。因为顺序存储结构存取元素操作的时间复杂度为 O(1)。五、算法设计题1试用顺序表作为存储结构,实现将线性表(a0,a1,a2,an-1)就地逆置的操作,所谓“就地”是指辅助空间为 O(1)。答:(1)顺序表的就地逆置分析:分别用两个整型变量指向顺序表的两端,同时向中间移动,移动
22、的同时互换两个下标指示的元素的值。void Seqreverse(SeqList L)顺序表的就地逆置for(i=0;j=L.1ength-1;inext;L-next=NULL;while(p!=NULL)r=p,p=p-next; r 指向当前待逆置的结点,p 记下下个结点r-next=Lnext;L-next=r; 放到表头 2设顺序表 L 是一个递增(允许有相同的值)有序表,试写一算法将 x 插入 L 中,并使 L 仍为一个有序表。99答:分析:先找到 x 的正确插入位置,然后将大于 x 的元素从后向前依次向下移动,最后将 x 插入到其位置上,同时顺序表长度增 1。void SeqLi
23、stinsert(SeqList L,int x)x 插入到递增有序的顺序表 L 中i=0;while(i=L.datai) i+; 找正确的插入位置for(k=L.length-1;k=i;k-) 元素从后往前依次后移L.datak+1:L.datak;L.data(ix; x 插入到正确位置L.1ength+;) 3.设单链表 L 是一个非递减有序表,试写一个算法将 x 插入其中后仍保持 L 的有序性。答:分析:此问题的关键是在链表中找到 x 的插入位置,因此需要两个指针一前一后地依次向后移动。void LinkListinsert(LinkedList L,int x)x 插入有序链表
24、L 中q=L;p=qnext;while(p!=NULLwhile(p!=NULL k+; if(!p) exit(0);q=p;k=l; p 指向 la 表中第 i 个结点while(q k=1; j1 时while(r i 指示 A 中元素原来的位置,m 为移动后的位置while(iC.datak) k+;else same=B.dataj; 找到了相同元素 samewhile(B.dataj=same) j+;while(C.datak=same) k+; j、k 后移到新的元素while(inext;while(p!=L 20约瑟夫环问题:任给正整数 n、k,按下述方法可得排列 1,2
25、,n 的一个置换:将数字l,2,n 环形排列,按顺时针方向从 1 开始计数;计满 k 时输出该位置上的数字(并从环中删去该数字),然后从下一个数字开始继续计数,直到环中所有数字均被输出为止。例如,n=10、k=3 时,输出的置换是 3,6,9,2,7,1,8,5,10。分别以数组和以不带头结点的、已知尾指针的单循环链表为存储结构解决上述问题。答:void Js1(int An,int N,iht K)以数组为存储结构for(i=0;inext; 此时 q 为头结点 fp 为 q 的前驱while(N0)for(j=2;jnext;printf(”%d”,q-data); N-;p-next=q
26、-next; 删除 q1616q=pnext; 第三节 栈和队列一、选择题1设有一顺序栈 s,元素 s1,s2,s3,s4,s5,s6 依次入栈,如果 6 个元素出栈的顺序是s2,s3,s4,s6,s5,s1,则栈的容量至少应该是( )。A2 B3 C5 D62若一个栈的输入序列是 a、b、c,则通过入栈、出栈操作可能得到 a、b、c 的不同排列个数为( )。A4 B5 C6 D73设有一顺序栈已经含有 3 个元素,如图 3-1 所示,元素 a4 正等待入栈。以下序列中不可能出现的出栈序列是( )。Aa3,a1,a4,a2 Ba3,a2,a4,a1 Ca3,a4,a2,a1 Da4,a3,a2
27、,a14和顺序栈相比,链栈有一个比较明显的优势是( )。A通常不会出现栈满的情况 B通常不会出现栈空的情况 C插入操作更容易实现 D删除操作更容易实现5若一个栈的输入序列是 1,2,3,4,n,输出序列的第一个元素是 n,则第 i 个输出元素是( )。A不确定 Bn-i Cn-i+1 Dn-i-16以下说法正确的是( )。A因链栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况 B因顺序栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况 C对于链栈而言,在栈满状态下,如果再进行入栈操作,则会发生“上溢” D对于顺序栈而言,在栈满状态下,如果再进行入栈操作,则会发生“下溢”7
28、顺序队列的入队操作应为( )。Asq.rear=sq.rear+1;sq.datasq.rear=x; Bsq.datasq.rear=x;sq.rear=sq.rear+1; Csq.rear=(sq.rear+1)maxsize;sq.datasq.rear+1=x; Dsq.datasq.rear=x;sq.rear=x; sq.rear=(sq.rear+1)maxslze;8循环队列的入队操作应为( )。Asqrear=sqrear+1;sqdatasqrear=x Bsqdatasqrear=x;sqrear=sqrear+l; Csqrear=(sqrear+1)maxsize;
29、sqdatasqrear=x; Dsqdatasqrear=x;sqrear=(sqrear+1)maxsize;9顺序队列的出队操作为( )。Asqfront=(sqfront+1)maxsize; Bsqfront=sqfront+1; Csqrear=(sqrear+1)maxsize; Dsqrear=sqrear+1;10循环队列的出队操作为( )。Asqfront=(sqfront+1)maxsize; Bsqfront=sqfront+1; Csqrear=(sqrear+1)maxsize; Dsqrear=sqrear+l;171711循环队列的队满条件为( )。A(sqre
30、ar+1)maxsize=(sqfront+1)maxsize; B(sqrear+1)maxsize=sqfront+1; C(sqrear+1)maxsize=sqfront; Dsqrear=sqfront;12循环队列的队空条件为( )。A(sqrear+1)maxsize=(sqfront+1)maxsize; B(sqrear+1)maxsize=sqfront+1; C(sqrear+1)maxsize=sqfront; Dsqrear=sqfront;13如果以链表作为栈的存储结构,则出栈操作时( )。A必须判别栈是否满 B判别栈元素的类型 C必须判别栈是否空 D对栈不做任何判
31、别14,向一个栈顶指针为 Top 的链栈中插入一个 s 所指结点时,其操作步骤为( )。ATop-next=s; Bs-next=Top-next;Top-next=s; Cs-next=Top;Top=s; Ds-next=Top;Top=Top-next;15从栈顶指针为 Top 的链栈中删除一个结点,并将被删结点的值保存到 x 中,其操作步骤为( )。Ax=Top-data;Top=Top-next; BTop=Top-next;x=Top-data; Cx=Top;Top=Top-next; Dx=Top-data;16在一个链队中,苕 f、r 分别为队头、队尾指针,则插入 s 所指结
32、点的操作为( )。Af-next=s;f=s; Br-next=s;r=s; Cs-next=r;r=s; Ds-next=f;f=s;17一个栈的入栈序列是 a,b,c,d,e,则栈的不可能的输出序列是( )。Ae,d,c,b,a Bd,e,c,b,a Cd,c,e,a,b Da,b,c,d,e18一个队列的入队序列是 1,2,3,4,则队列的可能的输出序列是( )。A4,3,2,1 B1,2,3,4 C1,4,3,2 D3,2,4,119设计一个判别表达式中左,右括号是否配对出现的算法,采用( )数据结构最佳。A线性表的顺序存储结构 B栈 C队列 D线性表的链式存储结构二、判断题1在顺序栈
33、栈满情况下,不能再入栈,否则会产生“上溢”。2与顺序栈相比,链栈的一个优点是插入和删除操作更加方便。3若一个栈的输入序列为 1,2,3,n,其输出序列的第一个元素为 n,则其输出序列的每个元素 ai 一定满足 ai=i+1(i=1,2,n)。4在链队中,即使不设置尾指针也能进行入队操作。5在对链队(带头指针)做出队操作时,不会改变 front 指针的值。6循环队列中元素个数为 rear-front。7一个栈的输入序列是 1,2,3,4,则在栈的输出序列中可以得到 4,3,1,28一个栈的输入序列是 1,2,3,4,则在栈的输出序列中可以得到 1,2,3,4。9若以链表作为栈的存储结构,则入栈需
34、要判断栈是否满10若以链表作为栈的存储结构,则出栈需要判断栈是否空。三、填空题1向一个栈顶指针为 Top 的链栈中插入一个 s 所指的结点时,其进行的操作是_ s-next=Top;Top =s;_。2从栈顶指针为 Top 的链栈中删除一个结点,并将结点保存在 x 中,进行的操作是_ x=Top-data;Top=Top-next;_。3在具有 n 个单元的循环队列中,队满时共有_n-1_个元素。4假设以 S 和 X 分别表示入栈和出栈操作,则对输入序列 a,b,c,d,e 进行一系列栈操作SSXSXSSXXX 之后,得到的输出序列为_ b,c,e,d,a _。18185设有数组 Am作为循环
35、队列的存储空间,front 为队头指针,rear 为队尾指针,则元素 x 执行入队操作的语句是_rear=(rear +1)(m+1); Arear=x;_。6在一个链队中,如果 f、r 分别为队头、队尾指针,则插入 s 所指结点的操作是_r-next=s; r=s;_。7栈的逻辑特点是_后进先出_,队列的逻辑特点是_先进先出_,二者的共同特点是_操作受限_。8_栈_可以作为实现递归函数调用的一种数据结构。9在队列中,新插入的结点只能添加到_队尾_。10链队在一定范围内不会出现_队满_的情况。当 lqfront=lqrear 时,队中无元素,此时_队空_。11设一个链栈的栈顶指针为 ls,栈中
36、结点的格式为 data:next,栈空的条件是_ ls = NULL_;如果栈不为空,则出栈操作为 p=ls; _ ls = ls -next _;free(p)。12对带有头结点的链队 lq,判定队列中只有一个数据元素的条件是_lq-front-next= lq-rear_。 13设有一个空栈,现在输入序列为 1,2,3,4,5,经过 push,push,pop,push,pop,push后,栈顶指针所指元素是_4_。14设用一维数组 Aln来表示一个栈,令 An为栈底。用整型变量 t 来指示当前栈顶的位置,At为栈顶元素。往栈中压入一个新元素时,变量 t 的值_加 1_,从栈中弹出一个元素
37、时,变量 t 的值_减 1_。设空栈时,输入序列 a,b,c 经过 push,pop,push,push,pop 操作后,从栈中弹出的元素是_c_。四、应用题1试证明:若借助栈由输入序列 1,2,3,n 得到输出序列 p1,p2,pn(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在 i0)层上至多有_2 i-1_个结点。4深度为 k(k0)的二叉树至多有_2 k-1_个结点。5对任何二叉树,若度为 2 的节点数为 n2,则叶子数 n0=_n2+1_。6满二叉树上各层的节点数已达到了二叉树可以容纳的_最大值_。满二叉树也是_完全_二叉树,但反之不然。7具有 n 个结点的完全二
38、叉树的深度为_log 2n+1_。8在顺序存储的二叉树中,编号为 i 和 j 的两个结点处在同一层的条件是_ log 2i = log2j _。9如果将一棵有 n 个结点的完全二叉树按层编号,则对任一编号为 i(0l,则 X 的双亲 PARENT(X)的编号为_i/2_。(2)若 2in,则结点 x 无_左孩子_且无_右孩子_;否则,X 的左孩子 LCHILD(X)的编号为_2i _。(3)若2i+1n,则结点 X 无_右孩子_;否则,X 的右孩子 RCHILD(X)的编号为_2i+1_。10二叉树通常有_顺序_存储结构和_链式_存储结构两类存储结构。11每个二叉链表还必须有一个指向_根_结点
39、的指针,该指针具有标识二叉链表的作用。12对二叉链表的访问只能从_根_指针开始。13具有 n 个结点的二叉树中,一共有_2n_个指针域,其中只有_n-1_个用来指向结点的左右孩子,其余的_n+1_个指针域为 NULL。14已知二叉树中叶子数为 40,仅有一个孩子的结点数为 20,则总结点数为_99_。15二叉树有不同的链式存储结构,其中最常用的是_二叉链表_与_三叉链表_。16可通过在非完全二叉树的“残缺”位置上增设_空指针_将其转化为完全二叉树。232317具有 100 个结点的完全二叉树的深度是_7_。18深度为 90 的满二叉树上,第 10 层有_512_个结点。19在_前序_遍历二叉树
40、的序列中,任何结点的子树上的所有结点都是直接跟在该结点之后。20具有 n 个结点的完全二叉树,若按层次从上到下、从左到右对其编号(根结点为 1 号),则编号最大的分支结点序号是_n/2_,编号最小的分支结点序号是_1_,编号最大的叶结点序号是_n_,编号最小的叶结点序号是_n/2+1_。21若一棵二叉树的叶子数为 n,则该二叉树中左、右子树皆非空的结点个数为_n-1_。22任意一棵具有 n 个结点的二叉树,若它有 m 个叶子,则该二叉树上度数为 1 的结点为_n-2m+1_个。23设有 30 个值,用它们构造一棵哈夫曼树,则该哈夫曼树中共有_59_个结点。24现有按中序遍历二叉树的结果为 AB
41、C,有_5_种不同形态的二叉树可以得到这一遍历结果。25以数据集4,5,6,7,10为叶结点的权值所构造的哈夫曼树的带权路径长度为_53_.26已知一棵度为 3 的树有 2 个度为 1 的结点,3 个度为 2 的结点,4 个度为 3 的结点,则该树中有_12_个叶结点。27设树 T 的度为 4,其中度为 1、2、3 和 4 的结点个数分别是 4、2、1 和 1,则 T 中叶结点的个数是_8_。28如果结点 a 有三个兄弟,而 b 是 a 的双亲,则 b 的度是_4_。29一棵树的形状如图 6-5 所示,它的根结点是_A_,叶结点是_E,J,K,L,O,P,Q,R,N,I_,结点H 的度是_3_
42、,这棵树的度是_4_,这棵树的深度是_5_,结点 F 的儿子结点是_J,K_,结点 G的父结点是_C_。30设结点 x 有左孩子结点 y、右孩子结点 z,用三种基本遍历方法得到的遍历序列中 x_不一定_是 y 的前驱,x_不一定_是 z 的后继,y_一定_是 z 的前驱(填“一定”,“不”、“不一定”)。31在树结构里,有且仅有一个结点没有前驱,称为根。非根结点有且仅有一个_前驱_,且存在一条从根到该结点的_惟一路径_。32含有 2n个结点的二叉树高度至少是_n+1_,至多是_2 n_(仅含根结点的二叉树高度为 1)。33设高度为 h 的二叉树只有度为 0 和 2 的结点,则此类二叉树的结点数
43、至少为_2h-1_,至多为_2h-1_。四、应用题3任意一个有 n(n0)个结点的二叉树,已知它有 m 个叶结点,试证明非叶结点有 m-1 个度为 2,其余度为 1。答:设度为 1 的结点数 n1, 设度为 2 的结点数 n2,分支数 B,则有:m+n1+n2=n, B+1=n, B=1n1+2n2,即:m+n1+n2=n, n1+2n2+1=n, 解之可得:n2=m-15分别写出图 6-7 所示二叉树的前序、中序和后序序列。2424答:前序:ABCDEF、中序:CBEFDA 和后序:CFEDBA6已知一棵二叉树的中序序列和后序序列分别为 BDCEAFHG 和 DECBHGFA,试画出这棵二叉
44、树,并写出其前序遍历序列。答:前序遍历序列:ABCDEFGH9分别画出图 6-10 所示二叉树对应的森林,并写出森林的前序和后序遍历序列。答:前序:ABDGCEFHIJK,后序:DGBAECIHJKF。11将代数式 y=3(x+a)-a/x2描述成表达式树,并写出前缀式和后缀式。答:前缀式:-3+xa/axx,后缀式:3xa+axx/-。13试证明:任一棵高度为 h1 的二叉树,其内部结点(除根、叶子之外的结点)的数目小于 2h-1-1,而叶结点数目小于或等于 2h-1。答:高度为 h 的满二叉树包含的结点个数最多,最下层是叶子,除根外,其余是内部结点,不包含叶子的子树高度是 h-1,该子树的
45、最多结点数是 2h-1-1. 除根外, 内部结点的数目应小于 2h-1-1.而整个树所含的最多结点数是 2h-1,所以,叶子数最多为 2h-1-(2h-1-1)= 2h-1个.14编码00,01,10,11、0,1,00,11,、0,10,110,111哪一组不是前缀码?答:编码00,01,10,11、0,10,110,111是前缀码, 0,1,00,11不是前缀码.15一棵度为 k 的树有 n1 个度为 1 的结点,n2 个度为 2 的结点,nk 个度为 k 的结点,问该树中有多少个叶结点?答:n=n0+n1+nk=1n1+2n2+knkn0=1+n2+2n3+(k-1)nk16一棵含有 n
46、 个结点的 k 叉树,可能达到的最大深度和最小深度各是多少?答:最大深度:n,最小深度:log k(n(k-1)+1五、算法设计题1以二叉链表作为存储结构,试编写求二叉树深度的算法。答:int bdepth(btree t) if (t=NULL) return 0;else l=bdepht(t-lchild); r=bdepht(t-rchild);return (lr?l:r)+1;2525第七节 查找一、选择题1顺序查找法适合于( )存储结构的查找表。A压缩 B散列 C索引 D顺序或链式2对采用折半查找法进行查找操作的查找表,要求按( )方式进行存储。A顺序存储 B链式存储 C顺序存储且结点按关键字有序 D链式存储且结点按关键字有序3设顺序表的长为 n,用顺序查找法,则其每个元素的平均查