ImageVerifierCode 换一换
格式:DOC , 页数:35 ,大小:2.60MB ,
资源ID:7302939      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7302939.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构期末复习章节试题(附答案).doc)为本站会员(hskm5268)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

数据结构期末复习章节试题(附答案).doc

1、1第一章概论 自测题答案 一、填空题1. 数据结构是一门研究非数值计算的程序设计问题中计算机的 操作对象 以及它们之间的 关系 和运算等的学科。2. 数据结构被形式地定义为(D, R) ,其中 D 是 数据元素 的有限集合,R 是 D 上的 关系 有限集合。3. 数据结构包括数据的 逻辑结构 、数据的 存储结构 和数据的 运算 这三个方面的内容。4. 数据结构按逻辑结构可分为两大类,它们分别是 线性结构 和 非线性结构 。5. 线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。6 在线性结构中,第一个结点 没有 前驱结点,其余每个结点有且只有

2、 1 个前驱结点;最后一个结点 没有 后续结点,其余每个结点有且只有 1 个后续结点。7. 在树形结构中,树根结点没有 前驱 结点,其余每个结点有且只有 1 个前驱结点;叶子结点没有 后续 结点,其余每个结点的后续结点数可以任意多个 。8. 在图形结构中,每个结点的前驱结点数和后续结点数可以 任意多个 。9数据的存储结构可用四种基本的存储方法表示,它们分别是顺序 、 链式 、 索引 和 散列 。10. 数据的运算最常用的有 5 种,它们分别是插入 、 删除、修改、 查找 、排序。11. 一个算法的效率可分为 时间 效率和 空间 效率。二、单项选择题( B )1. 非线性结构是数据元素之间存在一

3、种:A)一对多关系 B)多对多关系 C)多对一关系 D)一对一关系( C )2. 数据结构中,与所使用的计算机无关的是数据的 结构;A) 存储 B) 物理 C) 逻辑 D) 物理和存储( C )3. 算法分析的目的是:A) 找出数据结构的合理性 B) 研究算法中的输入和输出的关系C) 分析算法的效率以求改进 D) 分析算法的易懂性和文档性( A )4. 算法分析的两个主要方面是:A) 空间复杂性和时间复杂性 B) 正确性和简明性C) 可读性和文档性 D) 数据复杂性和程序复杂性( C )5. 计算机算法指的是:A) 计算方法 B) 排序方法 C) 解决问题的有限运算序列 D) 调度方法( B

4、)6. 计算机算法必须具备输入、输出和 等 5 个特性。A) 可行性、可移植性和可扩充性 B) 可行性、确定性和有穷性C) 确定性、有穷性和稳定性 D) 易读性、稳定性和安全性三、简答题1. 简述线性结构与非线性结构的不同点。答:线性结构反映结点间的逻辑关系是 一对一的,非线性结构反映结点间的逻辑关系是多对多的。2数据结构的常见的四种存储方式。答:顺序 、 链式 、 索引 和 散列 。3. 数据结构的逻辑结构主要有哪两大类,具体是什么?答:主要分为线性结构和非线性结构,其中线性结构反映结点间的逻辑关系是 一对一的,非线性结构反映结点间的逻辑关系是多对多的。非线性结构又包含树结构和图结构四、分析

5、下面各程序段的时间复杂度2. s=0;for i=0; itoptop=0 ST-toptop=m0( A )4. 李春葆判定一个队列 QU(最多元素为 m0)为满队列的条件是QU-rear QU-front = = m0 QU-rear QU-front 1= = m0 QU-front = = QU-rear QU-front = = QU-rear+1解:队满条件是元素个数为 m0。由于约定满队时队首指针与队尾指针相差 1,所以不必再减 1 了,应当选 A。当然,更正确的答案应该取模,即: QU-front = = (QU-rear+1)% m0( D ) 5数组用来表示一个循环队列,为

6、当前队列头元素的前一位置,为队尾元素的位置,假定队列中元素的个数小于,计算队列中元素的公式为()rf; () (n fr)% n; ()nrf; () (nr f)% n6. 【 98 初程 P71】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。设有 4 个数据元素 a1、a2 、a3 和 a4,对他们分别进行栈操作或队操作。在进栈或进队操作时,按a1、a2、a3、a4 次序每次进入一个元素。假设栈或队的初始状态都是空。现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A ,第二次出栈得到的元素是 B 是;类

7、似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素是 D 。经操作后,最后在栈中或队中的元素还有 E 个。供选择的答案:AD:a1 a2 a3 a4E: 1 2 3 0答:ABCDE2, 4, 1, 2, 247. 【 94 初程 P75】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。栈是一种线性表,它的特点是 A 。设用一维数组 A1,n来表示一个栈,An 为栈底,用整型变量 T 指示当前栈顶位置,AT 为栈顶元素。往栈中推入( PUSH)一个新元素时,变量

8、T 的值 B ;从栈中弹出(POP)一个元素时,变量 T 的值 C 。设栈空时,有输入序列 a,b,c,经过PUSH, POP, PUSH,PUSH ,POP 操作后,从栈中弹出的元素的序列是 D ,变量 T 的值是 E 。供选择的答案:A: 先进先出 后进先出 进优于出 出优于进 随机进出B,C: 加 1 减 1 不变 清 0 加 2 减 2D: a,b b,c c,a b,a c,b a,cE: n+1 n+2 n n-1 n-2答案:ABCDE= 2, 2, 1, 6, 4注意,向地址的高端生长,称为向上生成堆栈;向地址低端生长叫向下生成堆栈,本题中底部为 n,向地址的低端递减生成,称为

9、向下生成堆栈。8. 【 91 初程 P77】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是否 B 。当栈中元素为 n 个,做进栈运算时发生上溢,则说明该栈的最大容量为 C 。为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 D 分别设在这片内存空间的两端,这样,只有当 E 时,才产生上溢。供选择的答案:A,B:空 满 上溢 下溢C: n-1 n n+1 n/2D: 长度 深度 栈顶 栈底E:两个栈的栈顶同时到达栈空间的中心点 其中一个栈的栈顶到

10、达栈空间的中心点 两个栈的栈顶在达栈空间的某一位置相遇 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底答案:ABCDE2, 1, 2, 4, 3四、简答题(每小题 4 分,共 20 分)1. 【严题集 3.2和 3.11】说明线性表、栈与队的异同点。刘答:相同点:都是线性结构,都是逻辑结构的概念。都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表,只是对插入、删除运算加以限制。不同点:运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入、删除运算,因而是后进先出表 LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表 FIFO。 用途不同,堆栈用

11、于子程调用和保护现场,队列用于多道作业处理、指令寄存及其他运算等等。2. 【统考书 P60 4-11,难于严题集 3.1】设有编号为 1,2,3,4 的四辆列车,顺序进入一个栈式结构的车站,具体写出这四辆列车开出车站的所有可能的顺序。刘答:至少有 14 种。 全进之后再出情况,只有 1 种:4,3,2,1 进 3 个之后再出的情况,有 3 种,3,4,2,1 3,2,4,1 3,2,1,4 进 2 个之后再出的情况,有 5 种,2,4,3,1 2,3,4,1 2,1, 3,4 2,1,4,3 2,1,3,4 进 1 个之后再出的情况,有 5 种,1,4,3,2 1,3,2,4 1,3,4,2

12、1, 2,3,4 1,2,4,33. 【刘自编】假设正读和反读都相同的字符序列为“回文” ,例如, abba和abcba 是回文,abcde 和ababab则不是回文。假设一字符序列已存入计算机,请分析用线性表、堆栈和队列等方式正确输出其回文的可能性?答:线性表是随机存储,可以实现,靠循环变量(j-)从表尾开始打印输出;堆栈是后进先出,也可以实现,靠正序入栈、逆序出栈即可;5队列是先进先出,不易实现。哪种方式最好,要具体情况具体分析。若正文在机内已是顺序存储,则直接用线性表从后往前读取即可,或将堆栈栈顶开到数组末尾,然后直接用 POP 动作实现。 (但堆栈是先减后压还是)若正文是单链表形式存储

13、,则等同于队列,需开辅助空间,可以从链首开始入栈,全部压入后再依次输出。4. 【统考书 P60 4-13】顺序队的“假溢出”是怎样产生的?如何知道循环队列是空还是满?答:一般的一维数组队列的尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出” 。采用循环队列是解决假溢出的途径。另外,解决队满队空的办法有三: 设置一个布尔变量以区别队满还是队空; 浪费一个元素的空间,用于区别队满还是队空。 使用一个计数器记录队列中元素个数(即队列长度) 。我们常采用法,即队头指针、队尾指针中有一个指向实元素,而另一个指向空闲元素。判断循环队列队空标志是: f=rear 队满标志是

14、:f=(r+1)%N5. 【 统考书 P60 4-14】设循环队列的容量为 40(序号从 0 到 39) ,现经过一系列的入队和出队运算后,有 front=11,rear=19; front=19,rear=11 ;问在这两种情况下,循环队列中各有元素多少个?答:用队列长度计算公式: (Nr f)% N L=(401911)% 40=8 L=(401119)% 40=32五、阅读理解(每小题 5 分,共 20 分。至少要写出思路)1. 【严题集 3.7】按照四则运算加、减、乘、除和幂运算()优先关系的惯例,并仿照教材例 3-2的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:AB

15、C/D+EF6答:2 【严题集 3.3】写出下列程序段的输出结果(栈的元素类型 SElem Type 为 char) 。void main( )Stack S;Char x,y;InitStack(S);X=c;y=k;Push(S,x); Push(S,a); Push(S,y);Pop(S,x); Push(S,t); Push(S,x);Pop(S,x); Push(S,s);while(!StackEmpty(S) Pop(S,y);printf(y); ;Printf(x);答:输出为“stack” 。2. 【严题集 3.12】写出下列程序段的输出结果(队列中的元素类型 QElem

16、Type 为 char) 。void main( )Queue Q; Init Queue (Q);Char x=e; y=c;EnQueue (Q,h); EnQueue (Q,r); EnQueue (Q, y);DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,a); while(!QueueEmpty(Q) DeQueue (Q,y);printf(y); ;Printf(x);答:输出为“char” 。3. 【严题集 3.13】简述以下算法的功能(栈和队列的元素类型均为 int) 。void algo3(Queue int

17、 d;InitStack(S);while(!QueueEmpty(Q) DeQueue (Q,d); Push(S,d);while(!StackEmpty(S) Pop(S,d); EnQueue (Q,d); 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。六、算法设计(每小题 5 分,共 15 分。至少要写出思路)1. 【李春葆及严题集 3.19】假设一个算术表达式中包含圆括弧、方括弧和花括弧三种类型的括弧,编写一个判别表达式中括弧是否正确配对的函数 correct(exp,tag);其中:exp 为字符串类型的变量(可理解为每个字符占用一个数组元素) ,表示被判别的表

18、达式,tag 为布尔型变量。答:用堆栈 st 进行判定,将 ( 、 或 入栈,当遇到 、 或 ) 时,检查当前栈顶元素是否是对应的 ( 、 或 ,若是则退栈,否则返回表示不配对。当整个算术表达式检查完毕时,若栈为空表示括号正确配对,否则不配对。编程后的整个函数如下(李书 P3132)#define m0 100 /*m0 为算术表达式中最多字符个数*/correct(exp,tag)char expm0;int tag;char stm0;int top=0, i=1;tag=1;while (i0)tag=0; /*若栈不空,则不配对 */严题集对应答案:3.19 Status AllBra

19、ckets_Test(char *str)/判别表达式中三种括号是否匹配 InitStack(s); for(p=str;*p;p+) if(*p=(|*p=|*p=) push(s,*p); else if(*p=)|*p=|*p=) 8 if(StackEmpty(s) return ERROR; pop(s,c); if(*p=) if(*p= if(*p= /必须与当前栈顶括号匹配 /for if(!StackEmpty(s) return ERROR; return OK; /AllBrackets_Test 2001 级通信 6 班张沐同学答案(已上机通过)#include#inc

20、ludevoid push(char x);void pop();void correct(enum Boolean /原来的定义是 void correct(struct Stack* head,enum Boolean typedef struct Stackchar data;struct Stack *next;struct Stack *head,*p;enum BooleanFALSE,TRUEtag;void main()head=(struct Stack*)malloc(sizeof(struct Stack);head-data=S;head-next=NULL;/ hea

21、ds data has not been initialized! correct(tag);if(tag)printf(“Right!“);elseprintf(“Wrong!“);void push(char x)p=(struct Stack*)malloc(sizeof(struct Stack);if(!p)printf(“Theres no space.n“);elsep-data=x;p-next=head;head=p;9/ if you define the “Correct“ function like that/Debug will show that the Push

22、action doesnt take effectionvoid pop()if(head-next=NULL)printf(“The stack is empty.n“);elsep=head;head=head-next;free(p);/void correct(struct Stack* head,enum Boolean char y;printf(“Please enter a bds:“);for(i=0;y!=n;i+)scanf(“%c“,if(y=)else if(y=()|(y=)|(y=)push(y);/*调试程序显示,y 并没有被推入堆栈中。即 head-data

23、的值在 Push 中显示为 y 的值,但是出 Push 函数。马上变成 Null。*/elsecontinue;if(head-next=NULL) /原来的程序是 if(head =NULL) tag=TRUE;tag=TRUE;elsetag=FALSE;/*总结: 由于 head 为全局变量,所以不应该将其再次作为函数的变量。因为 C 语言的函数变量是传值机制,所以在函数中对参数进行了拷贝复本,所以不能改变 head 的数值。*/2. 【 统考书 P60 4-15】假设一个数组 squm存放循环队列的元素。若要使这 m 个分量都得到利用,则需另一个标志 tag,以 tag 为 0 或 1

24、 来区分尾指针和头指针值相同时队列的状态是“空”还是“满” 。试编写相应的入队和出队的算法。解:这就是解决队满队空的三种办法之 设置一个布尔变量以区别队满还是队空(其他两种见简答题) ;思路:一开始队空,设 tag=0,若从 rear 一端加到与 front 指针相同时,表示入队已满,则令 tag=1;若从 front 一端加到与 rear 指针相同时,则令 tag=0,表示出队已空。3.【严题集 3.31】试写一个算法判别读入的一个以为结束符的字符序列是否是“回文” 。10答:编程如下:int Palindrome_Test()/判别输入的字符串是否回文序列 ,是则返回 1,否则返回 0In

25、itStack(S);InitQueue(Q);while(c=getchar()!=)Push(S,c);EnQueue(Q,c); /同时使用栈和队列两种结构while(!StackEmpty(S)Pop(S,a);DeQueue(Q,b);if(a!=b) return ERROR;return OK;/Palindrome_Test 第 6 章 树和二叉树 自测卷解答 一、下面是有关二叉树的叙述,请判断正误(每小题 1 分,共 10 分)( )1. 若二叉树用二叉链表作存贮结构,则在 n 个结点的二叉树链表中只有 n1 个非空指针域。( )2.二叉树中每个结点的两棵子树的高度差等于 1

26、。 ( )3.二叉树中每个结点的两棵子树是有序的。 ( )4.二叉树中每个结点有两棵非空子树或有两棵空子树。 ( )5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。 (应当是二叉排序树的特点)( )6.二叉树中所有结点个数是 2k-1-1,其中 k 是树的深度。 (应 2i-1) ( )7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 ( )8.对于一棵非空二叉树,它的根结点作为第一层,则它的第 i 层上最多能有 2i1 个结点。 (应 2i-1)( )9.用二叉链表法(link-rlink )

27、存储包含 n 个结点的二叉树,结点的 2n 个指针区域中有 n+1 个为空指针。(正确。用二叉链表存储包含 n 个结点的二叉树,结点共有 2n 个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有 n-1 个结点的链域存放指向非空子女结点的指针,还有 n+1 个空指针。 )即有后继链接的指针仅 n-1 个。( )10. 01 年计算机系研题具有 12 个结点的完全二叉树有 5 个度为 2 的结点。最快方法:用叶子数n/26,再求 n2=n0-1=5 二、填空(每空 1 分,共 15 分)1 由个结点所构成的二叉树有 5 种形态。 2. 【计算机研 2000】 一棵深度为 6

28、的满二叉树有 n1+n2=0+ n2= n0-1=31 个分支结点和 26-1 =32 个叶子。注:满二叉树没有度为 1 的结点,所以分支结点数就是二度结点数。3 一棵具有个结点的完全二叉树,它的深度为 9 。( 注:用 log 2(n) +1= 8.xx +1=94. 【全国专升本统考题】设一棵完全二叉树有 700 个结点,则共有 350 个叶子结点。答:最快方法:用叶子数n/2350 5. 设一棵完全二叉树具有 1000 个结点,则此完全二叉树有 500 个叶子结点,有 499 个度为 2 的结点,有 1 个结点只有非空左子树,有 0 个结点只有非空右子树。答:最快方法:用叶子数n/250

29、0 ,n 2=n0-1=499。 另外,最后一结点为 2i 属于左叶子,右叶子是空的,所以有 1 个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数0.6. 【严题集 6.7】 一棵含有 n 个结点的 k 叉树,可能达到的最大深度为 n ,最小深度为 2 。11答:当 k=1(单叉树)时应该最深,深度 n(层) ;当 k=n-1(n-1 叉树)时应该最浅,深度2(层) ,但不包括 n=0 或 1 时的特例情况。教材答案是“完全 k 叉树” ,未定量。)7. 【96 程试题 1】 二叉树的基本组成部分是:根(N ) 、左子树(L)和右子树(R) 。因而二叉树的遍历次序有

30、六种。最常用的是三种:前序法(即按 N L R 次序) ,后序法(即按 L R N 次序)和中序法(也称对称序法,即按 L N R 次序) 。这三种方法相互之间有关联。若已知一棵二叉树的前序序列是BEFCGDH,中序序列是 FEBGCHD,则它的后序序列必是 F E G H D C B 。 解:法 1:先由已知条件画图,再后序遍历得到结果;法 2:不画图也能快速得出后序序列,只要找到根的位置特征。由前序先确定 root,由中序先确定左子树。例如,前序遍历 BEFCGDH 中,根结点在最前面,是 B;则后序遍历中 B 一定在最后面。法 3:递归计算。如 B 在前序序列中第一,中序中在中间(可知左

31、右子树上有哪些元素) ,则在后序中必为最后。如法对 B 的左右子树同样处理,则问题得解。8.【全国专升本统考题】中序遍历的递归算法平均空间复杂度为 O(n) 。答:即递归最大嵌套层数,即栈的占用单元数。精确值应为树的深度 k+1,包括叶子的空域也递归了一次。9. 【计算机研 2001】 用 5 个权值3, 2, 4, 5, 1 构造的哈夫曼( Huffman)树的带权路径长度是 33 。解:先构造哈夫曼树,得到各叶子的路径长度之后便可求出 WPL(453)2(12)3=33(15)(9) (6) (注:两个合并值先后不同会导致编码不同,即哈夫曼编码不唯一)4 5 3 (3) (注:合并值应排在

32、叶子值之后)1 2(注:原题为选择题:32 33 34 15)三、单项选择题(每小题 1 分,共 11 分)( C )1 不含任何结点的空树 。()是一棵树; ()是一棵二叉树; ()是一棵树也是一棵二叉树; ()既不是树也不是二叉树答:以前的标答是 B,因为那时树的定义是 n1( C )2二叉树是非线性数据结构,所以 。()它不能用顺序存储结构存储; ()它不能用链式存储结构存储; ()顺序存储结构和链式存储结构都能存储; ()顺序存储结构和链式存储结构都不能使用 ( C )3. 01 年计算机研题 具有 n(n0)个结点的完全二叉树的深度为 。() log 2(n) () log 2(n)

33、 () log 2(n) +1 () log 2(n)+1注 1:x 表示不小于 x 的最小整数; x表示不大于 x 的最大整数,它们与 含义不同!注 2:选(A)是错误的。例如当 n 为 2 的整数幂时就会少算一层。似乎 log 2(n) +1是对的?( A )4把一棵树转换为二叉树后,这棵二叉树的形态是 。()唯一的 ()有多种()有多种,但根结点都没有左孩子 ()有多种,但根结点都没有右孩子5. 【94 程 P11】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写12在答卷的对应栏内。树是结点的有限集合,它 A 根结点,记为 T。其余的结点分成为 m(m 0)个

34、 B 的集合 T1,T2,Tm,每个集合又都是树,此时结点 T 称为 Ti 的父结点,T i 称为 T 的子结点(1im) 。一个结点的子结点个数为该结点的 C 。供选择的答案A: 有 0 个或 1 个 有 0 个或多个 有且只有 1 个 有 1 个或 1 个以上 B: 互不相交 允许相交 允许叶结点相交 允许树枝结点相交C: 权 维数 次数(或度) 序答案:ABC1,1,36. 【 95 程 P13】 从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。二叉树 A 。在完全的二叉树中,若一个结点没有 B ,则它必定是叶结点。每棵树都能惟一地转换成与它对应

35、的二叉树。由树转换成的二叉树里,一个结点 N 的左子女是 N 在原树里对应结点的 C ,而 N 的右子女是它在原树里对应结点的 D 。供选择的答案A: 是特殊的树 不是树的特殊形式 是两棵树的总称 有是只有二个根结点的树形结构 B: 左子结点 右子结点 左子结点或者没有右子结点 兄弟CD: 最左子结点 最右子结点 最邻近的右兄弟 最邻近的左兄弟 最左的兄弟 最右的兄弟答案:A= B= C= D 答案:ABCDE2,1,1,3四、简答题(每小题 4 分,共 20 分)1. 【严题集 6.2】一棵度为 2 的树与一棵二叉树有何区别?答:度为 2 的树从形式上看与二叉树很相似,但它的子树是无序的,而

36、二叉树是有序的。即,在一般树中若某结点只有一个孩子,就无需区分其左右次序,而在二叉树中即使是一个孩子也有左右之分。2.01 年计算机研题设如下图所示的二叉树 B 的存储结构为二叉链表,root 为根指针,结点结构为:(lchild,data,rchild) 。其中 lchild,rchild 分别为指向左右孩子的指针,data 为字符型,root 为根指针,试回答下列问题:1. 对下列二叉树 B,执行下列算法 traversal(root),试指出其输出结果;2. 假定二叉树 B 共有 n 个结点,试分析算法 traversal(root)的时间复杂度。 (共 8 分)二叉树 B解:这是“先根

37、再左再根再右” ,比前序遍历多打印各结点一次,输出结果为:A B C C E E B A D F F D G G特点:每个结点肯定都会被打印两次;但出现的顺序不同,其规律是:凡是有左子树的结点,必间隔左子树的全部结点后再重复出现;如 A,B,D 等结点。反之马上就会重复出现。如C,E,F,G 等结点。时间复杂度以访问结点的次数为主,精确值为 2*n,时间渐近度为O(n).3. 01 年计算机研题【严题集 6.27】给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G ,I ; 中序遍历序列:D,C,B ,E,H ,A,G,I,F,试画出二叉树 B,并简述由任意二叉树

38、B 的前序遍历序列和中序遍历序列求二叉树 B 的思想方法。AB DC F GEC 的结点类型定义如下:struct nodechar data;struct node *lchild, rchild;C 算法如下:void traversal(struct node *root)if (root)printf(“%c”, root-data);traversal(root-lchild);printf(“%c”, root-data);traversal(root-rchild);13解:方法是:由前序先确定 root,由中序可确定 root 的左、右子树。然后由其左子树的元素集合和右子树的集

39、合对应前序遍历序列中的元素集合,可继续确定 root 的左右孩子。将他们分别作为新的 root,不断递归,则所有元素都将被唯一确定,问题得解。DAC FE GB H I4.【计算机研 2000】给定如图所示二叉树 T,请画出与其对应的中序线索二叉树。解:要遵循中序遍历的轨迹来画出每个前驱和后继。中序遍历序列:55 40 25 60 28 08 33 542825 3340 60 08 5455五、阅读分析题(每题 5 分,共 20 分)1. (P60 4-26 ) 试写出如图所示的二叉树分别按先序、中序、后序遍历时得到的结点序列。答:DLR:A B D F J G K C E H I L ML

40、DR: B F J D G K A C H E L I MLRD:J F K G D B H L M I E C A2. (P60 4-27 ) 把如图所示的树转化成二叉树。答:注意全部兄弟之间都要连线(包括度为 2 的兄弟),并注意原有连线结点一律归入左子树,新添连线结点一律归入右子树。ABE CK F H DL G IM J2825 3340 60 08 54 55282540555560330854NILNIL143.【严题集 6.17】阅读下列算法,若有错,改正之。4.【严题集 6.21】画出和下列二叉树相应的森林。答:注意根右边的子树肯定是森林,而孩子结点的右子树均为兄弟。六、算法设

41、计题(前 5 题中任选 2 题,第 6 题必做,每题 8 分,共 24 分)1.【严题集 6.42】编写递归算法,计算二叉树中叶子结点的数目。解:思路:输出叶子结点比较简单,用任何一种遍历递归算法,凡是左右指针均空者,则为叶子,将其打印出来。法一:核心部分为:DLR(liuyu *root) /*中序遍历 递归函数*/if(root!=NULL)if(root-lchild=NULL) printf(“%dn“,root-data);DLR(root-lchild);DLR(root-rchild); return(0);法二:int LeafCount_BiTree(Bitree T)/求二

42、叉树中叶子结点的数目 if(!T) return 0; /空树没有叶子 else if(!T-lchild /叶子结点 else return Leaf_Count(T-lchild)+Leaf_Count(T-rchild);/左子树的叶子数加 上右子树的叶子数 /LeafCount_BiTree 注:上机时要先建树!例如实验二的方案一。BiTree InSucc(BiTree q)/已知 q 是指向中序线索二叉树上某个结点的指针,/本函数返回指向*q 的后继的指针。r=q-rchild; /应改为 r=q;if(!r-rtag) while(!r-rtag)r=r-rchild; /应改为

43、 while(!r-Ltag) r=r-Lchild;return r; /应改为 return r-rchild;/ISucc答:这是找结点后继的程序。共有 3 处错误。注:当 rtag1 时说明内装后继指针,可直接返回,第一句无错。当 rtag 0 时说明内装右孩子指针,但孩子未必是后继,需要计算。中序遍历应当先左再根再右,所以应当找左子树直到叶子处。r=r-lchild; 直到 LTag=1; 应改为:while(!r-Ltag)r=r-L child;15 打印叶子结点值(并求总数)思路:先建树,再从遍历过程中打印结点值并统计。步骤 1 键盘输入序列 12,8,17,11,16,2,1

44、3,9,21,4,构成一棵二叉排序树。叶子结点值应该是 4,9, 13, 21, 总数应该是 4.127 172 11 16 21 4 9 13编程: 生成二叉树排序树之后,再中序遍历排序查找结点的完整程序如下: 说明部分为:#include #include typedef struct liuyuint data;struct liuyu *lchild,*rchild;test;liuyu *root;int sum=0;int m=sizeof(test);void insert_data(int x) /*如何生成二叉排序树?参见教材 P43C 程序*/ liuyu *p,*q,*s

45、;s=(test*)malloc(m);s-data=x;s-lchild=NULL;s-rchild=NULL;if(!root)root=s; return;p=root; while(p) /*如何接入二叉排序树的适当位置*/q=p;if(p-data=x)printf(“data already exist! n“);return;else if(xdata)p=p-lchild; else p=p-rchild;if(xdata)q-lchild=s;else q-rchild=s;DLR(liuyu *root) /*中序遍历 递归函数*/if(root!=NULL)if(root

46、-lchild=NULL) printf(“%dn“,root-data);DLR(root-lchild);DLR(root-rchild); return(0);main() /*先生成二叉排序树,再调用中序遍历递归函数进行排序输出*/int i,x;i=1; root=NULL; /*千万别忘了赋初值给 root!*/doprintf(“please input data%d:“,i);i+;scanf(“%d“, /*从键盘采集数据,以-9999 表示输入结束*/if(x=-9999) DLR(root);printf(“nNow output count value:%dn“,sum);return(0); 16else insert_data(x); /*调用插入数据元素的函数 */while(x!=-9999); retu

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报