数据结构80题参考答案(下)41-80
数据结构参考答案
简答一.1、已知模式串pat=’ADABBADADA’,写出该模式串的next函数值和nextval值;2、模式匹配算法是在主串中快速寻找模式的一种有效的方法,如果设主串的长度为m,模式的长度为n,则在主串中寻找模式的KMP算法的时间复杂性是多少?如果,某一模式 P=’abcaacabaca’,请给出它的NEXT函数值及NEXT函数的修正值NEXTVAL之值。
3、已知模式串pat=“abaabc”,写出该模式串的next函数值和nextval值;4、给出字符串‘abacabaaad’在KMP算法中的next和nextval数组。
二、(意思对即可,不一定是这种写法)1、数据结构按照逻辑结构分为哪四种结构,说出元素之间的关系?集合:无关系线性结构:一对一树形结构:一对多图形结构:多对多2、图形结构有几种存储结构?分别是什么存储结构?4种。
邻接矩阵,邻接表,十字链表,邻接多重表3、度数为2的树和二叉树有何区别?(1)度为2的树中至少有一个结点的度为2,而二叉树中没有这种要求。
(2)度为2的树不区分左右子树,而二叉树严格区分左右子树。
4、简述栈和队列的特点。
栈:是一种只能在一端进行插入或删除操作的线性表。
“后进先出”队列:是一种仅允许在表的一端进行插入操作,而在表的另一端进行删除操作的受限的线性表“先进先出”三(只是最终的结果,有的题可能需要中间步骤,自己完善一下)1、已知某有向图的顶点集合为{A,B,C,D,E,F},边集合为{〈A,B〉,〈A,C〉,〈A,E〉,〈C,F〉,〈E,D〉},画出该图的邻接表,以它为基写出深度优先、广度优先遍历序列(深度、广度遍历要求从结点A开始)。
深度:A B C F E D广度:A B C E F D2、设无向图G(如右图所示),给出该图的最小生成树上边的集合并计算最小生成树各边上的权值之和。
3、对下图所示的无向图,从顶点1开始,写出该图的深度优先遍历和广度优先遍历。
最新《数据结构》试题及答案(10套)
一、单选题(每题 2 分,共20分)1. 1.对一个算法的评价,不包括如下(B)方面的内容。
A.健壮性和可读性B.并行性C.正确性D.时空复杂度2. 2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点,则执行(A )。
A. p->next=HL->next; HL->next=p;B. p->next=HL; HL=p;C. p->next=HL; p=HL;D. HL=p; p->next=HL;3. 3.对线性表,在下列哪种情况下应当采用链表表示?( B )A.经常需要随机地存取元素B.经常需要进行插入和删除操作C.表中元素需要占据一片连续的存储空间D.表中元素的个数不变4. 4.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是( C )A. 2 3 1B. 3 2 1C. 3 1 2D. 1 2 35. 5.AOV网是一种(D)。
A.有向图B.无向图C.无向无环图D.有向无环图6. 6.采用开放定址法处理散列表的冲突时,其平均查找长度(B)。
A.低于链接法处理冲突 B. 高于链接法处理冲突C.与链接法处理冲突相同D.高于二分查找7.7.若需要利用形参直接访问实参时,应将形参变量说明为(D)参数。
A.值B.函数C.指针D.引用8.8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具有相同的(A)。
A.行号B.列号C.元素值D.非零元素个数9.9.快速排序在最坏情况下的时间复杂度为(D)。
A.O(log2n) B.O(nlog2n) C.0(n) D.0(n2)10.10.从二叉搜索树中查找一个元素时,其时间复杂度大致为( C )。
A. O(n)B. O(1)C. O(log2n)D. O(n2)二、运算题(每题 6 分,共24分)1. 1.数据结构是指数据及其相互之间的______________。
当结点之间存在M对N(M:N)的联系时,称这种结构为_____________________。
《数据结构》题库及答案
《数据结构》题库及答案一、选择题1.线性表的顺序存储结构是一种 的存储结构,线性表的链式存储结构是一种 的存储结构。
a. 随机存储;b.顺序存储;c. 索引存取;d. HASH 存取2.一个栈的入栈序列是a,b,c,d,e ,则栈的不可能的输出序列是 。
a. edcba;b. decba;c. dceab;d.abcde3.一个队列的入队序列是1,2,3,4,则队列的输出序列是 。
a. 4,3,2,1;b. 1,2,3,4;c. 1,4,3,2;d.3,2,4,14.在一个单链表中,已知p 结点是q 结点的直接前驱结点,若在p 和q 之间插入结点s ,则执行的操作是 。
a. s->nxet=p->next; p->next=s;b. p->next=s->next; s->next=p;c. q->next=s; s->next=p;d. p->next=s; s->next=q;5.设有两个串p,q ,求q 在p 中首次出现的位置的运算称作 。
a.联接b.模式匹配c.求子串d.求串长6.二维数组M 的成员是6个字符(每个字符占一个存储单元)组成的串,行下标i 的范围从0到8,列下标j 的范围从1到10,则存放M 至少需要 个字节。
a. 90b.180c.240d.540 7.在线索二叉树中,结点p 没有左子树的充要条件是 。
a. p->lch==NULLb. p->ltag==1c. p->ltag==1且p->lch=NULLd. 以上都不对8.在栈操作中,输入序列为(A ,B ,C ,D ),不可能得到的输出序列为:______A 、(A ,B ,C ,D ) B 、(D ,C ,B ,A ) C 、(A ,C ,D ,B ) D 、(C ,A ,B ,D )9.已知某二叉树的后序序列是dabec ,中序序列是debac ,则它的先序序列是 。
数据结构(含答案)
数据结构(含答案)数据结构数据结构是计算机科学的基础知识之一,它在计算机领域中有着重要的地位。
本文将介绍数据结构的概念、常见的数据结构类型以及其应用。
同时,还会对一些常见的数据结构问题进行解答。
一、概念简介在计算机科学中,数据结构是指存储和组织数据的方式。
它关注数据元素之间的关系,以及如何对数据进行插入、删除和查询等操作。
数据结构可以分为线性结构和非线性结构两大类。
1.1 线性结构线性结构是最简单的一种数据结构,它的特点是数据元素之间存在一对一的关系。
常见的线性结构包括数组、链表、栈和队列。
- 数组是一种连续存储数据元素的结构,可以通过下标快速访问元素。
但是数组的大小固定,插入和删除操作比较耗时。
- 链表是一种通过指针连接数据元素的结构,可以动态地进行插入和删除操作。
但是链表的随机访问效率较低。
- 栈是一种先进后出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
常见的应用场景包括函数调用、表达式求值等。
- 队列是一种先进先出(FIFO)的数据结构,插入操作在队尾进行,删除操作在队头进行。
常见的应用场景包括任务调度、消息传递等。
1.2 非线性结构非线性结构中,数据元素之间的关系不是一对一的,包括树和图等结构。
- 树是一种层次结构,由节点和边组成。
树的常见应用包括文件系统、数据库索引等。
- 图是由节点和边组成的网络结构,节点之间的关系可以是任意的。
图的应用非常广泛,包括社交网络、路由算法等。
二、数据结构问题解答2.1 如何判断一个链表中是否存在环?使用快慢指针可以判断一个链表中是否存在环。
假设有两个指针,一个每次移动一步,另一个每次移动两步。
如果链表中存在环,那么快指针迟早会追上慢指针。
如果快指针到达链表尾部时都没有追上慢指针,那么链表中不存在环。
2.2 如何判断一个二叉树是否是平衡二叉树?平衡二叉树是一种左子树和右子树高度差不超过1的二叉树。
判断一个二叉树是否是平衡二叉树可以使用递归的方法。
数据结构习题(包含全部答案解析)
数据结构习题集(自编)第一章绪论一、选择题1.数据结构是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的()和运算的学科。
A.结构B.关系 C.运算 D.算法2.在数据结构中,从逻辑上可以把数据结构分成()。
A.动态结构和静态结构 B.紧凑结构和非紧凑结构C.线性结构和非线性结构 D.逻辑结构和存储结构3.线性表的逻辑顺序和存储顺序总是一致的,这种说法()。
A.正确B.不正确 C.无法确定 D.以上答案都不对4.算法分析的目的是()。
A.找出算法的合理性 B.研究算法的输人与输出关系C.分析算法的有效性以求改进 D.分析算法的易懂性5. 算法的时间复杂度取决于()A.问题的规模B待处理数据的初态 C. A和B6.一个算法应该是()。
A.程序B.问题求解步骤的描述C.要满足五个基本特性 D.A和C.7. 下面关于算法说法错误的是()A.算法最终必须由计算机程序实现B.为解决某问题的算法与为该问题编写的程序含义是相同的C. 算法的可行性是指指令不能有二义性D. 以上几个都是错误的8.以下与数据的存储结构无关的术语是()。
A.循环队列 B. 链表 C. 哈希表 D. 栈9.在下面的程序段中,对x的赋值语句的频度为()for(i=0;i<n;i++)for(j=0;j<n;j++)x=x+1;nA. 2n B.n C.n2 D.log210.以下数据结构中,()是非线性数据结构A.树 B.字符串 C.队列 D.栈11. 下列数据中,()是线性数据结构。
A.哈夫曼树 B.有向无环图 C. 二叉排序树 D. 栈12.以下属于逻辑结构的是()。
A.顺序表 B. 哈希表 C.有序表 D. 单链表二、填空题1、_______是信息的载体,是对客观事物的符号表示,它能够被计算机识别、存储、加工和处理,________是对能够有效的输人到计算机中并且能够被计算机处理的符号的总称。
(数据、数据)2、数据元素是数据的______,有些情况下也称为元素、结点、顶点、记录等。
数据结构考试试题库含答案解析
数据结构考试试题库含答案解析数据结构习题集含答案⽬录⽬录 (1)选择题 (2)第⼀章绪论 (2)第⼆章线性表 (4)第三章栈和队列 (6)第四章串 (7)第五章数组和⼴义表 (8)第六章树和⼆叉树 (8)第七章图 (11)第⼋章查找 (13)第九章排序 (14)简答题 (19)第⼀章绪论 (19)第⼆章线性表 (24)第三章栈和队列 (26)第四章串 (28)第五章数组和⼴义表 (29)第六章树和⼆叉树 (31)第七章图 (36)第⼋章查找 (38)第九章排序 (39)编程题 (41)第⼀章绪论 (41)第⼆章线性表 (41)第三章栈和队列 (52)第四章串 (52)第五章数组和⼴义表 (52)第六章树和⼆叉树 (52)第七章图 (52)第⼋章查找 (52)第⼀章绪论1.数据结构这门学科是针对什么问题⽽产⽣的?(A )A、针对⾮数值计算的程序设计问题B、针对数值计算的程序设计问题C、数值计算与⾮数值计算的问题都针对D、两者都不针对2.数据结构这门学科的研究内容下⾯选项最准确的是(D )A、研究数据对象和数据之间的关系B、研究数据对象C、研究数据对象和数据的操作D、研究数据对象、数据之间的关系和操作3.某班级的学⽣成绩表中查得张三同学的各科成绩记录,其中数据结构考了90分,那么下⾯关于数据对象、数据元素、数据项描述正确的是(C )A、某班级的学⽣成绩表是数据元素,90分是数据项B、某班级的学⽣成绩表是数据对象,90分是数据元素C、某班级的学⽣成绩表是数据对象,90分是数据项D、某班级的学⽣成绩表是数据元素,90分是数据元素4.*数据结构是指(A )。
A、数据元素的组织形式B、数据类型C、数据存储结构D、数据定义5.数据在计算机存储器内表⽰时,物理地址与逻辑地址不相同,称之为(C )。
A、存储结构B、逻辑结构C、链式存储结构D、顺序存储结构6.算法分析的⽬的是(C )A、找出数据的合理性B、研究算法中的输⼊和输出关系C、分析算法效率以求改进D、分析算法的易懂性和⽂档型性7.算法分析的主要⽅法(A )。
(完整版)数据结构课后习题答案
第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。
如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
在有些情况下,数据元素也称为元素、结点、记录等。
数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。
例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
存储结构:数据对象在计算机中的存储表示,也称为物理结构。
抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。
2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。
答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。
每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。
(完整版)数据结构练习题及参考答案
数据结构练习题第一部分绪论一、单选题1. 一个数组元素a[i]与________的表示等价。
A、 *(a+i)B、 a+iC、 *a+iD、 &a+i2. 对于两个函数,若函数名相同,但只是____________不同则不是重载函数。
A、参数类型B、参数个数C、函数类型3. 若需要利用形参直接访问实参,则应把形参变量说明为________参数A、指针B、引用C、值4. 下面程序段的时间复杂度为____________。
for(int i=0; i<m; i++)for(int j=0; j<n; j++)a[i][j]=i*j;A、 O(m2)B、 O(n2)C、 O(m*n)D、 O(m+n)5. 执行下面程序段时,执行S语句的次数为____________。
for(int i=1; i<=n; i++)for(int j=1; j<=i; j++)S;A、 n2B、 n2/2C、 n(n+1)D、 n(n+1)/26. 下面算法的时间复杂度为____________。
int f( unsigned int n ) {if ( n==0 || n==1 ) return 1; else return n*f(n-1);}A、 O(1)B、 O(n)C、 O(n2)D、 O(n!)二、填空题1. 数据的逻辑结构被分为__________、_________、__________和__________四种。
2. 数据的存储结构被分为__________、_________、__________和__________四种。
3. 在线性结构、树形结构和图形结构中,前驱和后继结点之间分别存在着________、________和________的联系。
4. 一种抽象数据类型包括__________和__________两个部分。
5. 当一个形参类型的长度较大时,应最好说明为_________,以节省参数值的传输时间和存储参数的空间。
计算机专业基础综合(数据结构)模拟试卷8(题后含答案及解析)
计算机专业基础综合(数据结构)模拟试卷8(题后含答案及解析) 题型有:1. 单项选择题 2. 综合应用题单项选择题1-40小题,每小题2分,共80分。
下列每题给出的四个选项中,只有一个选项是最符合题目要求的。
1.若某线性表中最常用的操作是在最后一个结点之后插入一个结点和删除第一个结点,则下面最节省运算时间的存储方式是( )。
A.单链表B.带有头指针的单循环链表C.双链表D.带有尾指针的单循环链表正确答案:D解析:在链表中的最后一个结点之后插入一个结点要知道终端结点的地址,所以,单链表、带有头指针的单循环链表、双链表都不合适。
考虑在带有尾指针的单循环链表中删除第一个结点,其时间性能是O(1),所以答案是D。
知识模块:数据结构2.已知两个长度分别为l和s的降序链表,若将它们合并为一个长度为l+s 的升序链表,则最坏情况下的时间复杂度是( )。
A.D(l)B.D(ls)C.D(min(l,s))D.D(max(l,s))正确答案:D解析:在合并过程中,最坏的情况是两个链表中的元素依次进行比较,比较的次数最少是m和n中的最大值。
知识模块:数据结构3.线性表中存放的主要是( )。
A.整型常量B.字符C.数据元素D.信息元素正确答案:C解析:线性表中主要存放的是数据元素,而数据元素可以是整型也可以是字符型,但对于一个线性表来说,所有的数据元素的类型必须相同。
知识模块:数据结构4.下面的叙述中正确的是( )。
I.线性表在链式存储时,查找第i个元素的时间同i的值成正比Ⅱ.线性表在链式存储时,查找第i个元素的时间同i的值无关Ⅲ.线性表在顺序存储时,查找第i个元素的时间同i的值成正比A.仅ⅠB.仅ⅡC.仅ⅢD.Ⅰ、Ⅱ、Ⅲ正确答案:A解析:在线性表链式存储结构中,查找第i个元素的时间与i的位置成正比。
而在顺序存储结构中查找第i个元素的时间与i的位置无关。
知识模块:数据结构5.对于某线性表来说,主要的操作是存取任一指定序号的元素和在最后进行插入运算,那么应该选择( )存储方式最节省时间。
数据结构与算法测试题+参考答案
数据结构与算法测试题+参考答案一、单选题(共80题,每题1分,共80分)1、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用什么存储方式最节省运算时间?A、仅有头指针的单循环链表B、双链表C、仅有尾指针的单循环链表D、单链表正确答案:C2、数据结构研究的内容是()。
A、数据的逻辑结构B、数据的存储结构C、建立在相应逻辑结构和存储结构上的算法D、包括以上三个方面正确答案:D3、下列关于无向连通图特征的叙述中,正确的是:所有顶点的度之和为偶数边数大于顶点个数减1至少有一个顶点的度为1A、只有1B、1和2C、1和3D、只有2正确答案:A4、下面的程序段违反了算法的()原则。
void sam(){ int n=2;while (n%2==0) n+=2;printf(“%d”,n);}A、确定性B、可行性C、有穷性D、健壮性正确答案:C5、对任意给定的含 n (n>2) 个字符的有限集 S,用二叉树表示 S 的哈夫曼编码集和定长编码集,分别得到二叉树 T1 和 T2。
下列叙述中,正确的是:A、出现频次不同的字符在 T2 中处于相同的层B、出现频次不同的字符在 T1 中处于不同的层C、T1 的高度大于 T2 的高度D、T1 与 T2 的结点数相同正确答案:A6、数据序列{ 3,2,4,9,8,11,6,20 }只能是下列哪种排序算法的两趟排序结果?A、快速排序B、选择排序C、插入排序D、冒泡排序正确答案:A7、设散列表的地址区间为[0,16],散列函数为H(Key)=Key%17。
采用线性探测法处理冲突,并将关键字序列{ 26,25,72,38,8,18,59 }依次存储到散列表中。
元素59存放在散列表中的地址是:A、11B、9C、10D、8正确答案:A8、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是:A、每次划分后,先处理较短的分区可以减少递归次数B、递归次数与每次划分后得到的分区处理顺序无关C、递归次数与初始数据的排列次序无关D、每次划分后,先处理较长的分区可以减少递归次数正确答案:B9、以下数据结构中,()是非线性数据结构。
数据结构与算法练习题库(含答案)
数据结构与算法练习题库(含答案)一、单选题(共80题,每题1分,共80分)1、对一棵二叉树的结点从 1 开始顺序编号。
要求每个结点的编号大于其左子树所有结点的编号、但小于右子树中所有结点的编号。
可采用▁▁▁▁▁ 实现编号。
A、中序遍历B、先序遍历C、层次遍历D、后序遍历正确答案:A2、设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数?A、5B、4C、2D、0正确答案:C3、两个有相同键值的元素具有不同的散列地址A、一定不会B、一定会C、可能会D、有万分之一的可能会正确答案:C4、将元素序列{18,23,11,20,2,7,27,33,42,15}按顺序插入一个初始为空的、大小为11的散列表中。
散列函数为:H(Key)=Key%11,采用线性探测法处理冲突。
问:当第一次发现有冲突时,散列表的装填因子大约是多少?A、0.73B、0.27C、0.64D、0.45正确答案:D5、对N个记录进行归并排序,归并趟数的数量级是:A、O(NlogN)B、O(logN)C、O(N)D、O(N2)正确答案:B6、下列说法不正确的是:A、图的遍历是从给定的源点出发每一个顶点仅被访问一次B、图的深度遍历不适用于有向图C、遍历的基本算法有两种:深度遍历和广度遍历D、图的深度遍历是一个递归过程正确答案:B7、二叉树的中序遍历也可以循环地完成。
给定循环中堆栈的操作序列如下(其中push为入栈,pop为出栈): push(1), push(2), push(3), pop(), push(4), pop(), pop(), push(5), pop(), pop(), push(6), pop()A、6是根结点B、2是4的父结点C、2和6是兄弟结点D、以上全不对正确答案:C8、设最小堆(小根堆)的层序遍历结果为{1, 3, 2, 5, 4, 7, 6}。
数据结构试题
数据结构试题部分题目或答案有问题,现将已经发现的公布如下,同学在作这些模拟题的时候应着重做题方法的理解,遇到问题以教材或课件为准,不确定的地方可找同学商量或问我(1)试卷1第一套填空题第1题,试卷1第2套选择题第3题关于循环队列队头指针和队尾指针的约定与教材不一致,以教材或课件为准,实际上front指向的是队头元素,rear指向当前尚未被占用的第一个队列空间,队慢或队空的判定条件及入队/出队等操作具体可参考课件或教材(2)试卷1第一套应用题第5题,不声明邻接点顺序时默认编号最小的邻接点为第一邻接点,该图的深度优先遍历序列为*****,答案错。
此外,当给定邻接表时则邻接点顺序按照邻接表中的前后顺序确定,如试卷1第二套填空题第8题(3)试卷1第五套应用题第4题,两种方法处理冲突的方法下所求ASL值相等都为7/6(4)试卷1第五套填空题第8题答案给出的是小顶堆需满足的条件,大顶堆满足ki=k2i ki=k2i+1 (5)试卷1第一套填空题第9题模式匹配的BF算法以书中答案为准,两者区别在于,教材中存储字符串的数组的0号单元不存放有效字符,而试卷答案认为0号单元也放数组(6)试卷1第二套填空题第7题给定初始序列建堆未声明建大顶堆还是小顶堆,答案中给出的是小顶堆,大顶堆也要会建(7)试卷1第二套应用题第1题第4趟直接插入排序的结果应为(22,40,45,48,80,78);答案中给出的实际为第三趟,关键在于首元素自身有序不算一趟(8)试卷1第二套填空题第2题入栈操作以教材为准,教材中top是指向的栈顶(第一个空位置)的指针,与该套试卷中栈顶结构不一样,以教材为准(9)试卷1第三套填空题第12题答案中给出的不是拓扑序列,正确的是1423 (10)试卷1中多处遇到空指针NULL时写的是0而非NULL,实际两者皆可(11)试卷1第4套填空题第2题双向链表的删除答案错,应为p―llink-rlink=p-rlink; p-rlink-llink=p-llink;此外,注意课堂中讲的指针名和操作方法(12)第4套填空题第6题答案错,设哈夫曼树中共有99个结点,则该树中有____50_____个叶子结点;若采用二叉链表作为存储结构,则该树中有__100___个空指针域。
数据结构考试试题及答案
数据结构考试试题及答案一、选择题(每题2分,共20分)1. 在数据结构中,线性表的顺序存储结构通常使用什么类型的数据结构来实现?A. 栈B. 队列C. 数组D. 链表答案:C2. 下列选项中,哪一个不是二叉树的性质?A. 任意节点的左子树和右子树的深度可能不同B. 任意节点的左子树和右子树的深度相同C. 任意节点的左子树和右子树的节点数可能不同D. 任意节点的左子树和右子树的节点数相同答案:B3. 哈希表的冲突解决方法不包括以下哪种?A. 开放定址法B. 链地址法C. 线性探测法D. 排序法答案:D4. 以下哪种排序算法的时间复杂度最低?A. 冒泡排序B. 快速排序C. 插入排序D. 归并排序答案:B5. 在图的遍历算法中,深度优先搜索(DFS)使用的栈是:A. 系统栈B. 显式栈C. 隐式栈D. 以上都不是答案:B6. 以下哪种数据结构可以有效地实现稀疏矩阵的存储?A. 顺序存储B. 链表C. 散列D. 邻接矩阵答案:C7. 在二叉搜索树中,插入一个新节点后,树的平衡因子可能为:A. -2B. 0C. 2D. 3答案:A8. 堆数据结构中,父节点的值总是大于其子节点的值,这种堆被称为:A. 最小堆B. 最大堆C. 完全二叉树D. 满二叉树答案:B9. 以下哪个算法不是动态查找表的算法?A. 直接查找B. 二分查找C. 斐波那契查找D. 哈希查找答案:A10. 在图的遍历算法中,广度优先搜索(BFS)使用的栈是:A. 系统栈B. 显式栈C. 隐式栈D. 以上都不是答案:C二、填空题(每题2分,共20分)1. 在数据结构中,栈是一种______结构,遵循后进先出(LIFO)的原则。
答案:线性2. 一个具有n个顶点的无向图的边数最多为______。
答案:n*(n-1)/23. 快速排序算法的时间复杂度在最坏情况下为______。
答案:O(n^2)4. 在哈希表中,如果一个关键字的哈希地址已经被占用,则需要进行______。
(完整版)数据结构试题及答案
(完整版)数据结构试题及答案《数据结构》自考复习思考试题○10一、单项选择题(本大题共15小题,每小题2分,共30分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合C. 类型的有限集合D. 关系的有限集合2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( )A. n-i+1B. iC. i+1D. n-i3. 若不带头结点的单链表的头指针为head,则该链表为空的判定条件是( )A. head==NULLB. head->next==NULLC. head!=NULLD. head->next==head4. 引起循环队列队头位置发生变化的操作是( )A. 出队B. 入队C. 取队头元素D. 取队尾元素5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( )A. 2,4,3,1,5,6B. 3,2,4,1,6,5C. 4,3,2,1,5,6D. 2,3,5,1,6,46. 字符串通常采用的两种存储方式是( )A. 散列存储和索引存储B. 索引存储和链式存储C. 顺序存储和链式存储D. 散列存储和顺序存储7. 设主串长为n,模式串长为m(m≤n),则在匹配失败情况下,朴素匹配算法进行的无效位移次数为( )A. mB. n-mC. n-m+1D. n8. 二维数组A[12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A[9][7]的地址为( )A. 429B. 432.C. 435D. 4389. 对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是( )A. (e,f)B. ((e,f))C. (f)D. ( )10. 下列图示的顺序存储结构表示的二叉树是( )11. n个顶点的强连通图中至少含有( )A. n-1条有向边B. n条有向边C. n(n-1)/2条有向边D. n(n-1)条有向边12. 对关键字序列(56,23,78,92,88,67,19,34)进行增量为3的一趟希尔排序的结果为( )A. (19,23,56,34,78,67,88,92)B. (23,56,78,66,88,92,19,34)C. (19,23,34,56,67,78,88,92)D. (19,23,67,56,34,78,92,88)13. 若在9阶B-树中插入关键字引起结点分裂,则该结点在插入前含有的关键字个数为( ) A. 4 B. 5C. 8D. 914. 由同一关键字集合构造的各棵二叉排序树( )A. 其形态不一定相同,但平均查找长度相同B. 其形态不一定相同,平均查找长度也不一定相同C. 其形态均相同,但平均查找长度不一定相同.D. 其形态均相同,平均查找长度也都相同15. ISAM文件和VSAM文件的区别之一是( )A. 前者是索引顺序文件,后者是索引非顺序文件B. 前者只能进行顺序存取,后者只能进行随机存取C. 前者建立静态索引结构,后者建立动态索引结构D. 前者的存储介质是磁盘,后者的存储介质不是磁盘二、填空题(本大题共10小题,每空2分,共20分)16. 数据的逻辑结构在计算机存储器内的表示,称为数据的____________。
自考数据ku试题及答案
自考数据ku试题及答案自考数据结构试题及答案一、选择题1. 在数据结构中,算法的复杂度主要分为哪两大类?A. 时间复杂度和空间复杂度B. 静态复杂度和动态复杂度C. 内部复杂度和外部复杂度D. 逻辑复杂度和物理复杂度答案:A2. 下列数据结构中,哪个是线性数据结构?A. 树B. 图C. 栈D. 队列答案:A3. 在二叉树的遍历中,先根节点再左子树后右子树的遍历方式被称为:A. 前序遍历B. 中序遍历C. 后序遍历D. 层序遍历答案:A二、填空题1. 在顺序表中,逻辑上相邻的元素在物理位置上_________。
答案:也相邻2. 哈希表是一种通过_________来实现快速访问的数据结构。
答案:哈希函数3. 快速排序的最坏情况时间复杂度是_________。
答案:O(n^2)三、简答题1. 请简述链表和数组的区别。
答案:链表和数组都是用于存储一系列数据的数据结构,但它们在存储和访问数据时有以下区别:- 数组是一块连续的内存空间,通过下标索引直接访问数据,但大小固定,一旦定义不能改变。
- 链表由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针,不要求物理存储上的连续性,可以动态添加或删除节点。
2. 什么是堆栈(Stack)?请简述其特点。
答案:堆栈是一种特殊的线性表,只能在一端(称为栈顶)进行数据的添加和删除操作,遵循后进先出(LIFO)的原则。
其特点包括: - 先进后出(LIFO):最后放入的元素最先被取出。
- 有限制的访问:只能在栈顶添加或删除数据,不能访问除栈顶之外的其他元素。
四、计算题1. 给定一个单链表,设计一个算法计算链表的节点个数。
答案:可以使用一个指针遍历链表,每遍历到一个节点,计数器加一,直到指针指向空,算法结束。
时间复杂度为O(n)。
五、应用题1. 假设有一个字符串数组,需要按照字典序排序,请使用归并排序算法实现。
答案:归并排序是一种分治算法,它将数组分成两半,分别对它们排序,然后将排序好的两半合并在一起。
数据结构试题集(包含答案 完整版)
第一章概论一、选择题1、研究数据结构就是研究( D )。
A. 数据的逻辑结构B. 数据的存储结构C. 数据的逻辑结构和存储结构D. 数据的逻辑结构、存储结构及其基本操作2、算法分析的两个主要方面是( A )。
A. 空间复杂度和时间复杂度B. 正确性和简单性C. 可读性和文档性D. 数据复杂性和程序复杂性3、具有线性结构的数据结构是( D )。
A. 图B. 树C. 广义表D. 栈4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、( B )等5个特性。
A. 可执行性、可移植性和可扩充性B. 可执行性、有穷性和确定性C. 确定性、有穷性和稳定性D. 易读性、稳定性和确定性5、下面程序段的时间复杂度是( C )。
for(i=0;i<m;i++)for(j=0;j<n;j++)a[i][j]=i*j;A. O(m2)B. O(n2)C. O(m*n)D.O(m+n)6、算法是( D )。
A. 计算机程序B. 解决问题的计算方法C. 排序算法D. 解决问题的有限运算序列7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示( C )。
A. O(n)B. O(nlog2n)C. O(n2)D. O(log2n)8、下面程序段的时间复杂度为( C )。
i=1;while(i<=n)i=i*3;A. O(n)B. O(3n)C. O(log3n)D. O(n3)9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的()和运算等的学科。
A. 结构B. 关系C. 运算D. 算法10、下面程序段的时间复杂度是(A )。
i=s=0;while(s<n){i++;s+=i;}A. O(n)B. O(n2)C. O(log2n)D. O(n3)11、抽象数据类型的三个组成部分分别为( A)。
A. 数据对象、数据关系和基本操作B. 数据元素、逻辑结构和存储结构C. 数据项、数据元素和数据类型D. 数据元素、数据结构和数据类型12、通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释错误的是()。
数据结构各章习题及答案!
数据结构习题及解答第1章 概述【例1-1】分析以下程序段的时间复杂度。
for(i=0;i<n;i++) for(j=0;j<m;j++) A[i][j]=0;解:该程序段的时间复杂度为O (m*n )。
【例1-2】分析以下程序段的时间复杂度。
i=s=0; ① while(s<n) { i++; ② s+=i; ③ }解:语句①为赋值语句,其执行次数为1次,所以其时间复杂度为O (1)。
语句②和语句③构成while 循环语句的循环体,它们的执行次数由循环控制条件中s 与n 的值确定。
假定循环重复执行x 次后结束, 则语句②和语句③各重复执行了x 次。
其时间复杂度按线性累加规则为O (x )。
此时s 与n 满足关系式:s ≥n ,而s=1+2+3+…+x 。
所以有:1+2+3+…+x ≥n ,可以推出:x=nn 241212811+±-=+±-x 与n 之间满足x=f(n ),所以循环体的时间复杂度为O (n ),语句①与循环体由线性累加规则得到该程序段的时间复杂度为O (n )。
【例1-3】分析以下程序段的时间复杂度。
i=1; ① while(i<=n) i=2*i; ②解:其中语句①的执行次数是1,设语句②的执行次数为f (n ),则有:n n f ≤)(2。
log)得:T(n)=O(n2【例1-4】有如下递归函数fact(n),分析其时间复杂度。
fact(int n){ if(n<=1)return(1);①elsereturn(n*fact(n-1));②}解:设fact(n)的运行时间函数是T(n)。
该函数中语句①的运行时间是O(1),语句②的运行时间是T(n-1)+ O(1),其中O(1)为常量运行时间。
由此可得fact(n)的时间复杂度为O(n)。
习题1一、单项选择题1.数据结构是指(1. A )。
A.数据元素的组织形式B.数据类型C.数据存储结构D.数据定义2.数据在计算机存储器内表示时,物理地址与逻辑地址不相同的,称之为(2. C )。
数据结构试题及答案
数据结构试题及答案试题1.请说明数据结构的定义和作用。
2.请列举数据结构的分类,并简要描述每种分类的特点。
3.请解释什么是线性数据结构,并举例说明。
4.请解释什么是非线性数据结构,并举例说明。
5.请简述栈和队列的特点,并提供实际应用场景。
6.请说明二叉树的定义,并解释二叉树的遍历方式。
7.请解释什么是图数据结构,并提供图的应用场景。
8.请解释什么是散列表,并解释散列表的应用场景。
9.请说明堆数据结构的定义和特点。
10.请解释什么是哈希表,并提供哈希表的应用场景。
答案1.数据结构的定义和作用数据结构是一种组织和存储数据的方式,它定义了数据之间的关系和操作。
数据结构的作用是为了有效地管理和处理大量数据,并提高程序的执行效率和内存利用率。
2.数据结构的分类及特点–线性数据结构:线性数据结构是数据元素之间存在一对一的关系,数据元素之间只能以线性的方式连接。
例如:数组、链表、栈、队列等。
线性数据结构的特点是:数据元素之间具有顺序关系,可以实现快速的查找和插入,但插入和删除操作可能导致大量元素的移动。
–非线性数据结构:非线性数据结构是数据元素之间存在一对多或多对多的关系,数据元素之间可以以任意非线性连接方式组织。
例如:树、图等。
非线性数据结构的特点是:数据元素之间不存在固定的顺序关系,可以更灵活地表示数据之间的关系,但查找和插入的效率可能较低。
3.线性数据结构的例子线性数据结构的一个例子是数组。
数组是一种连续存储数据的结构,每个元素占据相同的大小。
数组的元素通过索引访问,索引从0开始。
例如,一个整型数组可以表示一组整数,可以通过索引快速访问和修改数组中的元素。
4.非线性数据结构的例子非线性数据结构的一个例子是树。
树是一种分层存储数据的结构,包含一个根节点和若干个子节点。
每个节点可以有多个子节点,但只能有一个父节点。
例如,二叉树是一种特殊的树,每个节点最多有两个子节点。
5.栈和队列的特点及应用场景–栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
数据结构习题集和答案
第1章绪论1、填空题1.常见的数据结构有集合,_线性__结构,__树形___结构,__图形__结构等四种。
2.常见的存储结构有__顺序存储_______结构,__链式存储____结构等两种。
3.数据的基本单位是_数据元素___,它在计算机中是作为一个整体来处理的。
4.数据结构中的结构是指数据间的逻辑关系,常见的结构可分为两大类,__线性结构____和__非线性结构___。
2、选择题1. 算法的计算量的大小称为计算的(B)。
A.效率 B. 复杂性 C. 现实性D. 难度2. 算法的时间复杂度取决于(C)A.问题的规模 B. 待处理数据的初态 C. A和B D. 以上都不对3.计算机算法指的是(1)(c),它必须具备(2)(B)这三个特性。
(1) A.计算方法 B. 排序方法 C. 解决问题的步骤序列 D. 调度方法(2) A.可执行性、可移植性、可扩充性 B. 可执行性、确定性、有穷性C. 确定性、有穷性、稳定性D. 易读性、稳定性、安全性4. 下面关于算法说法错误的是(D)A.算法最终必须由计算机程序实现B.为解决某问题的算法同为该问题编写的程序含义是相同的C. 算法的可行性是指指令不能有二义性D. 以上几个都是错误的3、应用题1、给出以下算法的时间复杂度.void fun(int n){int i=1,k=100;while(i<n){k=k+1;i=i+2;}}时间复杂度为____O(n)_____。
2、给出以下算法的时间复杂度.void fun2(int n){int i=1,k=100;while(i<n){i=i*10;k=k+1;}}时间复杂度为____O(log n)___________。
第2章线性表1、填空题1. 线性表按照存储结构不同主要有两种实现方式,一种是__顺序_表,另一种是___链___表。
2.顺序表采用__随机___访问机制对数据元素进行访问。
3.若在单链表结点p的后面插入一个新的结点s,则其操作序列为:①____s->next=p->next_____________;②____p->next=s___________________;4.在单向链表中,若要删除某个结点p,一般要找到__p的前趋__结点,才能实现该操作。
数据结构试题与答案
data
60 50 78 90 34
40
next
35
7204
1
A[0] A[3] A[2] A[7] A[1] A[5] A[4] A[0]
线性表为:( 78, 50, 40, 60, 34, 90)
2. 请画出下图的邻接矩阵和邻接表。
1. 邻 接 矩 阵 :
01110 10101 11011 10101 01110
7. AOV 网是一种 ________有向 无回路 ___________ 的图。
8. 在一个具有 n 个顶点的无向完全图中,包含有 ____n-1_ n(n-1)/2 ___条边,在一个具有 n
个顶点的有向完全图中,包含有 ____n-1___n(n-1) _条边。
9. 假定一个线性表为 (12,23,74,55,63,40) ,若按 Key % 4 条件进行划分, 使得同一余数的元
}//while, 出循环时 i 中的值即为 return i; }//CountX
x 结点个数
4
数据结构试卷(二)
一、选择题 (24 分 )
1.下面关于线性表的叙述错误的是(
)。
(A) 线性表采用顺序存储必须占用一片连续的存储空间
(B) 线性表采用链式存储不必占用一片连续的存储空间
(C) 线性表采用链式存储便于插入和删除操作的实现
item=BST->data;//
查找成功
return ____item__
true _____;}
else if(item<BST->data)
return Find(______BST->data____
BST->left ____,item);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广工数据结构80道上机题仅供参考最后缺了几题41void swap(ElemType &a,ElemType &b){ElemType t;t=a;a=b;b=t;}void Rotate(Array1D &a, int n, int k)/* a[n] contains the elements, *//* rotate them right circlely by k sits */{int j,l;k=n-k%n-1;for(j=0,l=k;j<l;j++,l--)//前半段{swap(a[j],a[k-j]);}for(j=k+1,l=n-1;j<l;j++,l--)//后半段{swap(a[j],a[l]);}for(j=0,l=n-1;j<l;j++,l--)//全部逆转{swap(a[j],a[l]);}}42Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)/* 三元组表示的稀疏矩阵加法: C=A+B */{if(A.mu!=B.mu||A.nu!=B.nu) return 0;ElemType t;int i=1,j=1,k=1;C.mu=A.mu,C.nu=A.nu,C.tu=0;while(i<=A.tu&&j<=B.tu){if((A.data[i].i==B.data[j].i)&&(A.data[i].j==B.data[j].j))//相等{t=A.data[i].e+B.data[j].e;if(t) //不为0{C.data[k].i=A.data[i].i;C.data[k].j=A.data[i].j;C.data[k].e=t;k++;}i++;j++;}else if((A.data[i].i>B.data[j].i)||(A.data[i].i==B.data[j].i&&A.data[i].j>B.data[j].j))//A 中元素位置大于B中{C.data[k].i=B.data[j].i;C.data[k].j=B.data[j].j;C.data[k].e=B.data[j].e;k++;j++;}else//A中位置小于B{C.data[k].i=A.data[i].i;C.data[k].j=A.data[i].j;C.data[k].e=A.data[i].e;k++;i++;}}while(i<=A.tu){C.data[k].i=A.data[i].i;C.data[k].j=A.data[i].j;C.data[k].e=A.data[i].e;k++;i++;}while(j<=B.tu){C.data[k].i=B.data[j].i;C.data[k].j=B.data[j].j;C.data[k].e=B.data[j].e;k++;j++;}C.tu=k-1;return 1;}43Status GetElem(T2SMatrix M, int i, int j, ElemType &e)/* 求二元组矩阵的元素A[i][j]的值e */{int k=M.cpot[i];if(i>M.mu||i<1||j>M.nu||j<1) return ERROR;//越界..e=0;while(k<M.cpot[i+1])//直到下一行的第一个非零元{if(M.data[k].j==j)e=M.data[k].e;k++;}return OK;}44void OutCSM(CrossList M, void(*Out3)(int, int, int))/* 用函数Out3,依次以三元组格式输出十字链表表示的矩阵*/ {int i=0;OLink p;while(i<=M.mu){if(M.rhead[i]){p=M.rhead[i];while(p){Out3(p->i,p->j,p->e);p=p->right;}}i++;}}45int GListDepth(GList ls)/* Return the depth of list */{int max,dep;GList p;if(!ls) return 1;if(ls->tag==0) return 0;for(max=0,p=ls;p;p=p->un.ptr.tp){dep=GListDepth(p->un.ptr.hp);max=max>dep?max:dep;}return max+1;}46Status Equal(GList A, GList B)/* 判断广义表A和B是否相等,是则返回TRUE,否则返回FALSE */{if(!A&&!B) return TRUE;if(!A->tag&&!B->tag&&A->un.atom==B->un.atom) return TRUE;//原子时比较if(A->tag&&B->tag)//不是原子,子表递归{if(Equal(A->un.ptr.hp,B->un.ptr.hp)&&Equal(A->un.ptr.tp,B->un.ptr.tp))return TRUE;}return FALSE;}47void OutAtom(GList A, int layer, void(*Out2)(char, int))/* 递归地用函数Out2输出广义表的原子及其所在层次,layer表示当前层次*/{if(!A) return ;if(!A->tag) Out2(A->un.atom,layer);else{OutAtom(A->un.ptr.hp,layer+1,Out2);OutAtom(A->un.ptr.tp,layer,Out2);}}48Status Dencendant(Array1D L,Array1D R,int n,int u,int v)/* If node 'u' is the dencendant of node 'v', *//* then return 'TRUE' else return 'FALSE'. *//* L[i] is the left child of the i_th node, *//* R[i] is the right child of the i_th node *//* in the Binary Tree which has n nodes. */{if(u<=0||u>n) return FALSE;if(u==L[v]||u==R[v]) return TRUE;while(L[v])if(Dencendant(L,R,n,u,L[v])) return TRUE;while(R[v])if(Dencendant(L,R,n,u,R[v])) return TRUE;return FALSE;}49Status Dencend(Array1D L, Array1D R, int n, int u, int v, Array1D T)/******************************************************************/ {int i;if(u>n||u<=0) return FALSE;T[1]=0;for(i=1;i<=n;i++){if(L[i]) T[L[i]]=i;if(R[i]) T[R[i]]=i;}while(T[u]){if(T[u]==v) return TRUE;u=T[u];}return FALSE;}50Status Similar(BiTree t1, BiTree t2)/* 判断两棵二叉树是否相似的递归算法*/{if(!t1&&!t2) return TRUE;if((!t1->lchild&&t2->lchild)||(t1->rchild&&!t2->rchild)) return FALSE;if(Similar(t1->lchild,t2->lchild)&&Similar(t1->rchild,t2->rchild)) return TRUE;return FALSE;}51void PreOrder(BiTree bt, void (*visit)(TElemType))/* 使用栈,非递归先序遍历二叉树bt,*//* 对每个结点的元素域data调用函数visit */{Stack s;BiTree p=bt;InitStack(s);while(p||!StackEmpty(s)){if(p){visit(p->data);//访问根节点Push(s,p);p=p->lchild;}else{Pop(s,p);p=p->rchild;//右孩子}}}52void PostOrder(BiTree bt, void (*visit)(TElemType)) /* 使用栈,非递归后序遍历二叉树bt,*//* 对每个结点的元素域data调用函数visit */ {Stack s;SElemType p,q;p.ptr=bt;InitStack(s);Push(s,p);//根节点入栈p.tag=0;while(!StackEmpty(s)){Pop(s,p);//顶点元素出栈if(p.tag) visit(p.ptr->data);//可访问else{p.tag=1;Push(s,p);//root入栈q=p;if(p.ptr->rchild){q.ptr=p.ptr->rchild;q.tag=0;Push(s,q);//右孩子入栈}q=p;if(p.ptr->lchild){q.ptr=p.ptr->lchild;q.tag=0;Push(s,q);//左孩子入栈}}}}53TElemType ans;TElemType f(BiTree bt, int &k){if(bt&&k==1) return bt->data;else{if(bt->lchild){k--;ans=f(bt->lchild,k);}//遍历zuoif(bt->rchild){k--;ans=f(bt->rchild,k);}//遍历右return ans;}}TElemType PreOrder(BiTree bt, int k)/* bt is the root node of a binary linked list, *//* Preorder travel it and find the node whose */ /* position number is k, and return its value. */ /* if can't found it, then return '#'. */ {ans='#';if(k&&bt)ans=f(bt,k);return ans;}54int ans=0;//全局变量void f(BiTree bt, int &x);void Leaves(BiTree bt, int &x)/* Count the leaf node of the BiTree *//* whose root node is bt to x. */{ans=0;if(!bt->lchild&&!bt->rchild) x=0;else f(bt,x);}void f(BiTree bt, int &x)//求叶子数目{if(!bt->lchild&&!bt->rchild) ans++;else if(!bt->lchild) f(bt->rchild,x);//左为空else if(!bt->rchild) f(bt->lchild,x);//右为空else//都不空{f(bt->rchild,x);f(bt->lchild,x);}x=x>ans?x:ans;}55void Exchange(BiTree &bt)/* Exchange the left and right leaves of *//* bitree whose root node is bt */{BiTree t;if(bt)//不空则交换左右孩子{t=bt->lchild;bt->lchild=bt->rchild;bt->rchild=t;Exchange(bt->lchild);//遍历左孩子Exchange(bt->rchild);//右}}56int ans=0;int dep(BiTree T)//求子树深度{int ld,rd;if(!T) return 0;else{ld=dep(T->lchild);rd=dep(T->rchild);}return (ld>rd?ld:rd)+1;}int Depthx(BiTree T, TElemType x)/* 求二叉树中以值为x的结点为根的子树深度*/ {if(T->data==x)//找到结点计算高度{ans=dep(T);return ans;}else{if(T){if(Depthx(T->lchild,x)||Depthx(T->rchild,x)) return ans;//找到则返回结果else return 0;//找不到返回0}}}57void CopyBiTree(BiTree T, BiTree &TT)/* 基于层次遍历的非递归复制二叉链表*/{Queue q,cq;BiTree t;QElemType e,ce;if(!T){TT=NULL;return;}InitQueue(q);InitQueue(cq);//复制树队列TT=(BiTree)malloc(sizeof(BiTNode));TT->data=T->data;//复制根结点TT->lchild=NULL;TT->rchild=NULL;EnQueue(cq,TT);EnQueue(q,T);//根入队while(!QueueEmpty(q)){DeQueue(q,e);DeQueue(cq,ce);if(e->lchild)//复制左{t=(BiTree)malloc(sizeof(BiTNode));t->data=e->lchild->data;t->lchild=NULL;t->rchild=NULL;ce->lchild=t;EnQueue(q,e->lchild);//左孩子入队EnQueue(cq,ce->lchild);}if(e->rchild)//复制右{t=(BiTree)malloc(sizeof(BiTNode));t->data=e->rchild->data;t->lchild=NULL;t->rchild=NULL;ce->rchild=t;EnQueue(q,e->rchild); //右孩子入队EnQueue(cq,ce->rchild);}}}58void LevelOrder(BiTree bt, char *ss)/* travel BiTree bt by level, Return result by ss. */ {if(!bt){ss="";return;}int i=0;Queue q;QElemType e;InitQueue(q);EnQueue(q,bt);//根入队ss[i++]=bt->data;while(!QueueEmpty(q)){DeQueue(q,e);if(e->lchild){ss[i++]=e->lchild->data;EnQueue(q,e->lchild);//左孩子入队}if(e->rchild){ss[i++]=e->rchild->data;EnQueue(q,e->rchild);//右孩子入队}}ss[i]='\0';}59Status CompleteBiTree(BiTree bt)/* judge if the binary tree whose root is bt *//* is a complete tree. */ {if(!bt) return TRUE;int i=0;Queue q;QElemType e;InitQueue(q);EnQueue(q,bt);//根入队while(!QueueEmpty(q)){DeQueue(q,e);if(!e) i=1;//已经到最后else if(i) return FALSE;//不是完全二叉树else{EnQueue(q,e->lchild);//左孩子入队EnQueue(q,e->rchild);//右孩子入队}}return TRUE;}60int find(char c,char *pre,int pos){int i;for(i=pos;pre[i]!='\0';i++)if(c==pre[i]) return i;return i;}void BuildBiTree(BiTree &bt, int ps, char *pre,int is, char *ino, int n)/* 当前要建立的子树bt的元素总数为n,*//* 元素在前序序列pre的起始位置为ps,*//* 元素在中序序列ino的起始位置为is */{int m,llen,rlen;if(n<=0) bt=NULL;else{bt=(BiTree)malloc(sizeof(BiTNode));bt->data=pre[ps];//创建结点,pre数组中m=find(pre[ps],ino,is);//在pre中从is起找与pre[ps]相同的元素位置llen=m-is;//以m为根,左边个数rlen=n-llen-1;//右边元素个数BuildBiTree(bt->lchild,ps+1,pre,is,ino,llen);//构造左边BuildBiTree(bt->rchild,ps+llen+1,pre,m+1,ino,rlen);//右边}}61Status DfsReachable(ALGraph g, int i, int j)/* Judge if it exists a path from vertex 'i' to *//* vertex 'j' in digraph 'g'. *//* Array 'visited[]' has been initialed to 'false'.*/{ArcNode *p;visited[i]=TRUE;for(p=g.vertices[i].firstarc;p;p=p->nextarc){if(p){if(p->adjvex==j) return TRUE;if(!visited[p->adjvex])if(DfsReachable(g,p->adjvex,j)) return TRUE;}}return FALSE;}62Status BfsReachable(ALGraph g, int i, int j)/* Determine whether it exists path from vertex i to *//* vertex j in digraph g with Breadth_First Search. *//* Array 'visited' has been initialed to 'false'. */{Queue q;int t;ArcNode *p;InitQueue(q);EnQueue(q,i);while(!QueueEmpty(q)){DeQueue(q,t);visited[t]=TRUE;//标志走过for(p=g.vertices[t].firstarc;p;p=p->nextarc){if(p->adjvex==j) return TRUE;//存在路径if(!visited[p->adjvex]) EnQueue(q,p->adjvex);}}return FALSE;}63void Traverse(Graph dig, V ertexType v0, void (*visit)(V ertexType)) /* Travel the digraph 'dig' with Depth_First Search. */{int i,w;if(dig.vexnum==0) return ;for(i=0;i<dig.vexnum;i++) visited[i]=0;SStack s;InitStack(s);Push(s,v0);while(!StackEmpty(s)){GetTop(s,v0);//取栈顶元素i=LocateV ex(dig,v0);//v0的位置if(!visited[i]){visited[i]=1;visit(v0);}for(w=FirstAdjV ex(dig,i);w>=0;w=NextAdjV ex(dig,i,w))//查找v0的邻接点{if(!visited[w])//未访问则入栈,取栈顶元素{Push(s,GetV ex(dig,w));break;}}if(w<0) Pop(s,v0); //出栈}}64Status SinglePath(ALGraph g, V ertexType sv, V ertexType tv, int k, char *sp)/* Judge whether it exists a path from sv to tv with length k *//* in graph g, return path using string sp if exists. */{int i,j,q;//从sv开始深搜到tvArcNode *p;if(sv==tv&&!k)//两点重合{inpath(sp,sv);return OK;}i=LocateV ex(g,sv);//找sv的位置visited[i]=1;inpath(sp,sv);//sv加入路径for(p=g.vertices[i].firstarc;p;p=p->nextarc)//遍历i点的邻接点{q=p->adjvex;if(!visited[q]){if(SinglePath(g,g.vertices[q].data,tv,k-1,sp)) return OK;//存在路径else depath(sp,g.vertices[q].data);//从路径中删除}}visited[i]=0;//重置return FALSE;}65void APath(ALGraph g, V ertexType sv, V ertexType tv,StrARR &path, int &i,char *sp){int k,j,q,n;//从sv开始深搜到tvArcNode *p;k=LocateV ex(g,sv);//找sv的位置visited[k]=1;inpath(sp,sv);//sv加入路径if(sv==tv)//存在路径{for(n=0;sp[n]!='\0';n++){path[i][n]=sp[n];}path[i][n]='\0';//.....上一组数据会留下杂物,要清掉..i++;}elsefor(p=g.vertices[k].firstarc;p;p=p->nextarc)//遍历k点的邻接点{q=p->adjvex;if(!visited[q]){APath(g,g.vertices[q].data,tv,path,i,sp);}}depath(sp,sv);visited[k]=0;//重置}void AllPath(ALGraph g, V ertexType sv, V ertexType tv,StrARR &path, int &i)/* Get all the paths from vertex sv to tv, save them *//* into Array path which contains string components. *//* Return the number of path using i */ {char spa[MAX_VERTEX_NUM+1];APath(g,sv,tv,path,i,spa);}66.67.68.int Search(SSTable a, KeyType k)/* Index the element which key is k *//* in StaticSearchTable s. *//* Return 0 if x is not found. */{int i;for(i=1;i<=a.length;i++)//下标从1开始..- -if(a.elem[i].key==k) return i;return 0;}69.int BinSearch(SSTable s, int low, int high, KeyType k)/* Index the element which key is k *//* in StaticSearchTable s. *//* Return 0 if x is not found. */{while(low<=high){int mid=(low+high)/2;if(s.elem[mid].key==k) return mid;else if(s.elem[mid].key>k)return BinSearch(s,low,mid-1,k);elsereturn BinSearch(s,mid+1,high,k);}return 0;}70.Status IsBSTree(BiTree t)/* 判别给定二叉树t是否为二叉排序树。