王道数据结构试题总结

绪论

题目:可以用()定义一个完整的数据结构。

​ A.数据元素
​ B.数据对象
​ C.数据关系
​ D.抽象数据类型

解析:D,抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示,从而构成了一个完整的数据结构定义。

题目:以下属于逻辑结构的是()

B.哈希表 C.有序表 A.顺序表 D.单链表

解析:C,顺序表、哈希表和单链表表示几种数据结构,既描述逻辑结构,也描述存储结构和数据运算。而有序表是指关键字有序的线性表,可以链式存储也可以顺序存储,仅描述了元素之间的逻辑关系,故它属于逻辑结构。

题目:以下与数据的存储结构无关的术语是()

B.链表 C.哈希表 D.栈 A.循环队列

解析:D,数据的存储结构有顺序存储、链式存储、索引存储和散列存储。循环队列(易错点)是用顺序表表示的队列,是一种数据结构。栈是一种抽象数据类型,可采用顺序存储或链式存储,只表示逻辑结构。

题目:以下关于数据结构的说法中,正确的是()

A.数据的逻辑结构独立于其存储结构
B.数据的存储结构独立于其逻辑结构
C.数据的逻辑结构唯一决定了其存储结构
D.数据结构仅由其逻辑结构和存储结构决定

解析:A,数据的逻辑结构是以面向实际问题的角度出发的,只采用抽象表达方式,独立于存储结构,数据的存储方式有多种不同的选择:而数据的存储结构是逻辑结构在计算机上的映射,它不能独文于逻辑结构而存在。数据结构包括三个要素,缺一不可。

题目:在存储数据时,通常不仅要存储各数据元素的值,而且还要存储()。

A.数据的操作方法
B.数据元素的类型
C.数据元素之间的关系
D.数据的存取方法

解析:C,存储数据时,不仅要存储数据元素值,还要存储数据元素之间的关系

题目:阶乘算法的时间复杂度()

int factorial(int n){
	if(n <= 1) return 1;
    return n * factorial(n - 1);
}

解析:O(n),本题是求阶乘n!的递归代码,即n*(n-1)*…*1,共执行n次乘法操作,故T(n)=O(n)。

题目:已知两个长度分别为m和n的升序链表,若将它们合并为一个长度为m+n的降序链表,则最坏情况下的时间复杂度

A. O(n) B.O(m×n) C. O(min(m, n)) D. O(max(m, n))

解析:两个升序链表合并,两两比较表中元素,每比较一次确定一个元素的链接位置(取较小元素,头插法)。当一个链表比较结束后,将另一个链表的剩余元素插入即可。最坏的情况是两个链表中的元素依次进行比较,时间复杂度为O(max(m,n))。

题目:下面说法错误的是( )

I.算法原地工作的含义是指不需要任何额外的辅助空间
II.在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2^n)的算法
Ⅲ.所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界
Ⅳ.同一个算法,实现语言的级别越高,执行效率就越低

解析:Ⅰ,算法原地工作是指算法所需的辅助空间是常量

题目:分析代码的时间复杂度

y = 0;
while((y + 1) * (y + 1) <= n){
    y++;
}

解析:O(n^(1/2)),设循环共执行t次,每循环一次,y加一,最终t==y。故t^2 <= n,解得T(n)=O(n^(1/2))

线性表

题目:线性表是县有n个( )的有限序列

A,数据表 B.字符 C数据元素 D、数据项

解析:C,线性表是由具有相同数据类型的有限个数据元素组成的,数据元素是由数据项组成的,数据项是数据的不可分割的最小单位。

题目:以下()是一个线性表。

A. 由n个实数组成的集合 B.由100个字符组成的序列 C.所有整数组成的序列 D.邻接表

解析:B,线性表的定义要求为有限序列,而C中序列的元素个数是无穷多个,C错误;而A中指定的是集合,集合中各元素没有前后驱关系,A错误;D是属于存储结构,线性表是一种逻辑结构,不要将二者混为一谈。只有B满足线性表定义的条件。

题目:顺序存储结构的优点()

A.存储密度大 B.插入运算方便 C.删除运算方便 D.方便地运用于各种逻辑结构的存储表

解析:A,顺序表不像链表要在结点中存放指针域,因此存储密度较大,A正确。D是错误的,比如对于树形结构,顺序表显然不如链表表示起来方便。

题目:若线性表最常用的操作是存取第i个元素及其前驱和后继元素的值,为了提高效率,应采用()的存储方式。

A.单链表 B.双向链表 C.单循环链表 D.顺序表

解析:D,题干实际要求能够最快存取第i-1、i和i+1个元素值。A、B、C都只能从头结点依次顺序查找,时间复杂度为O(n),只有顺序表可以随机存取,时间复杂度为O(1)。

题目:在n个元素的线性表的数组表示中,以下时间复杂度为O(1)的操作是( )

I.访问第i个结点(1<i<n)粒求第i全结点的直接前驱(2<i<n)
II.在最后一个结点后插入一个新的结点
Ⅲ.删除第1个结点
Ⅳ.在第i个结点后插入一个结点(1<i<n)

A.I B.II、Ⅲ C.I、II D.I、Ⅱ、Ⅲ

解析:C
Ⅰ中,时间复杂度显然为O(1);II中,在最后一个结点插入一个新结点不需要移动元素,故也为O(1);Ⅲ中,第一个结点后的结点需要依次前移,时间复杂度为O(n);Ⅳ中,需要移动n-i个结点,时间复杂度为O(n)。

​ 在一个具有 n 个元素的线性表的数组表示中,在最后一个结点后插入一个新的结点的时间复杂度是 O(1)。由于数组是连续存储的数据结构,可以通过直接在数组的末尾进行插入操作。无论数组的大小如何,该插入操作只需要执行一次,因此时间复杂度是常数级别的。需要注意的是,如果数组已经满了,即达到了数组的最大容量,那么插入操作可能需要重新分配更大的内存空间,并将原有的元素复制到新的内存空间中。此时的时间复杂度将取决于重新分配和复制元素的操作,通常是 O(n)。但是在一般情况下,假设数组还有足够的空间进行插入操作,那么时间复杂度为 O(1)。

设线性表有n个元素,顺序输出这n个值,在顺序表和链表实现效率一样高。

解析:都需要依次访问,时间复杂度一样

若长度为n的非空线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,i的合法值应该是( )

A.1 ≤ i ≤ n B.1 ≤ i ≤ n+1 C.0 ≤ i ≤ n-1 D.0 ≤ i ≤ n

解析:B

由于线性表的下标从 1 开始,所以插入操作的位置 i 的合法值应当是从 1 开始到 n+1 之间(包括边界值)。当 i 为 1 时,表示在表的头部插入元素;当 i 为 n+1 时,表示在表的末尾插入元素;当 i 为其它值时,表示在表的中间位置插入元素。

题目:下列关于线性表说法正确的是( )

I.顺序存储方式只能用于存储线性结构
ⅡI.取线性表的第i个元素的时间与i的大小有关
Ⅲ.静态链表需要分配较大的连续空间,插入和删除不需要移动元素
Ⅳ.在一个长度为n的有序单链表中插入一个新结点并仍保持有序的时间复杂度为O(n)
V.若用单链表来表示队列,则应该选用带尾指针的循环链表

解析:Ⅲ、Ⅳ、Ⅴ

​ 顺序存储方式同样适合图和树的存储,如满二叉树的顺序存储,Ⅰ错误。Ⅲ是静态链表的特有性质。单链表只能顺序查找插入位置,时间复杂度为O(n),若为顺序表,可采用折半查找,时间复杂度可降至O(logn),Ⅳ正确。队列需要在表头删除元素,表尾插入元素,故采用带尾指针的循环单链表较为方便,插入和删除的时间复杂度都是O(1),V正确。

题目:单链表中,增加一个头结点的目的是为了( ).

A.使单链表至少有一个结点 B.标识表结点中首结点的位置 C.方便运算的实现 D.说明单链表是线性表的链式存储

解析:C

单链表设置头结点的目的是为了方便运算的实现,主要好处体现在:第一,有头结点后,插入和删除数据元素的算法统一了,不再需要判断是否在第一个元素之前插入或删除第一个元素;第二,不论链表是否为空,其头指针是指向头结点的非空指针,链表的头指针不变,因此空表和非空表的处理也就统一了。

题目:某线性表中最常见的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最省时间。

A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表

解析:D

在最后一个元素之后插入元素,需要先找到最后一个元素,故A、B和C的时间复杂度均为O(n)。B因为没有特殊的指针指示头结点或尾结点,故需从某一结点向固定的方向顺序依次搜索插入和删除的位置,时间复杂度也为O(n)。D 的两种算法的时间复杂度都是O(1)

题目:带头结点的双循环链表L为空的条件是()

A.L->priorL&&L->nextNULL
B.L->priorNULL&&L->next=NULL
C. L->prior=NULL&&L->next
L
D. L->priorL&&L->nextL

解析:D

循环双链表L判空的条件是头结点(头指针)的prior和next域都指向它自身

题目:一个链表最常用的操作是在未尾插入结点和删除结点,则选用()最节省时间。

A.带头结点的双循环链表 B.单循环链表 C.带尾指针的单循环链表 D.单链表

解析:A

​ 在链表的末尾插入和删除一个结点时,需要修改其相邻结点的指针域。而寻找尾结点以及尾结点的前驱结点,只有带头结点的双循环链表所需要的时间最少。

题目:设对n(n>l)个元素的线性表的运算只有4种:删除第一个元素;删除最后一个元素;在第一个元素之前插入新元素,在最后一个元素之后插入新元素,则最好使用( ).

A.只有尾结原指针没有头结点指针的循环单链表
B.只有尾结点指针没有头结点指针的非循环双链表
C.只有头结点指针没有尾结点指针的循环双链表
D.既有头结点指针也有尾结点指针的循环单链表

解析:C

对于A,删除尾结点*p时,需要找到*p的前一个结点,时间复杂度为O(n)。对于B,删除首结点*p时,需要找到*p结点,这里没有直接给出头结点指针,而通过尾结点的prior指针找到*p结点的时间复杂度为O(n)。对于D,删除尾结点*p时,需要找到*p的前一个结点,时间复杂度为O(n)。对于C,执行这4种算法的时间复杂度均为O(1)

栈和队列

知识点

顺序共享栈

共享栈:两个栈共享同一片存储空间,这片存储空间不单独属于任何一个栈,某个栈需要的多一点,它就可能得到更多的存储空间,两个栈的栈底在这片存储空间的两端,元素入栈时,两个top指针向存储空间中间移动

循环队列

//入队
rear = (rear + 1) % maxsize;
//出队
front = (front + 1) % maxsize;

特殊矩阵的压缩处理

特殊矩阵
/*
	特殊矩阵指:矩阵中有许多值相同的元素(包括0),且这些元素的分布有一定规律。当矩阵的维数比较大时,矩阵占据的内存单元相当多,这时,利用特殊矩阵数据元素的分布规律压缩矩阵的存储空间,对许多应用问题来说有重要意义
*/
    
对称矩阵
/*
	对称阵的元素关于主对角线(左上到右下)对称,比如
	12 6 1
	6  8 0
	1  0 6		该矩阵主对角线12--8--6
*/
    
三对角矩阵
/*
	在线性代数中,一个三对角矩阵是矩阵的一种,它「几乎」是一个对角矩阵。准确来说:一个三对角矩阵的非零系数在主对角线上,或比主对角线低一行的对角线上,或比主对角线高一行的对角线上。
	1 4 0 0
	3 4 0 0
	0 2 3 4
	0 0 1 3
*/

题目

题目:3个不同元素依次进栈,能得到()种不同的出栈序列。

A.4 B.5 C.6 D.7

解析:B

对于n个不同的元素进栈,出栈序列个数(2n)!/(n+1)(n!×n!) ,其他情况只能穷举

设有火车车轨,入口到出口之间有n条轨道,列车的行进方向均为从左至右,列车可驶入任意一条轨道。现有编号为l~9的9列列车,驶入的次序依次是8,4,2,5,3,9,1,6,7。若期望驶出的次序依次为l~9,则n至少是( )。

A.2 B.3 C.4 D.5

解析:C

显然先入队的元素必须小于后入队的元素(否则,如果8和4入同一队列,8在前4在后,那么出队时只能是8在前4在后。所以轨道可分为四条

9 8
7 6 5 4
3 2
1

题目:一个栈的入栈序列为1,2,3,…,n,其出栈序列是p1,p2,p3......pn。若p2=3,则 P3可能取值的个数是()

A.n-3 B.n-2 C. n-l D.无法确定

解析:C

显然,3之后的4,5,…,n都是P3可取的数。接下来分析1和2:P1可以是3之前入栈的数(可能是1或2)也可以是4。
P1=1时,P3可取2;
P1=2时,P3可取1;
P1=4时,P3可取除1、3、4之外的所有数;
故P3可能取除3之外的所有数,个数为n-1

题目:元素a、b、c、d、e依次进入初始为空的栈中,若元素进栈后可停留、可出栈,直到所有元素都出栈,则在所有可能的出栈序列中,以元素d开头的序列个数是( )。

A.3 B.4 C. 5 D.6

解析:B

出栈顺序必为d_c_b_a_,e的顺序不定,在任意一个"_"上都有可能

题目:设有一个顺序共享栈share[0: n-1],其中第一个栈顶指针 topl 的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是( )

A.top2 - top1 == 1 B.top1 - top2 == 1 C.top1 == top2

解析:A

共享栈:两个栈共享同一片存储空间,这片存储空间不单独属于任何一个栈,某个栈需要的多一点,它就可能得到更多的存储空间,两个栈的栈底在这片存储空间的两端,元素入栈时,两个top指针向存储空间中间移动

就此题而言:share.top1 = -1,share.top2 = n

题目:循环队列存储在数组A[0….n]中,则入队时的操作为()

A. rear=rear+1 B.rear=(rear+1) mod (n-1) C. rear=(rear+1) mod n D rear=(rear+1 ) mod (n+1)

解析:D

循环队列中新元素入队时的操作是rear =(rear + 1) MOD maxsize,本题中maxsize =n+1。因此入队操作应为rear = (rear+1)MOD (n +1)。

题目:已知循环队列存储在一维数组A[0.….n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时 front和rear的值分别是()

A.0,0
B.0,n-1
C. n-1,0
D.n-1,n-1

解析:B
根据题意,第一个元素进入队列后存储在A[0]处,此时front和 rear值都为0。入队时由于要执行(rear+1)%n操作所以如果入队后指针指向0,则 rear初值为n-l,而由于第一个元素在A[0]中,插入操作只改变rear指针,所以front为0不变。

题目:循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是( )

A.队空:end1 == end2; 队满:endl == (end2+1)mod M
B.队空:endl == end2; 队满:end2 == (end1+1)mod (M-1)

解析:A

​ end1 指向队头元素,可知出队的操作是先从A[end1]读数,然后end1再加1。end2指向队尾元素的后一个位置,可知入队操作是先存数到A[end2],然后end2再加1。若把A[0]储存第一个元素,当队列初始时,入队操作是先把数据放到A[0],然后end2自增,即可知 end2初值为0;而end1 指向的是队头元素,队头元素的在数组A中的下标为0,所以得知 end1初值也为0,可知队空条件为endl==end2

题目:在用单链表实现队列时,队头在链表的()位置。

A.链头 B.链尾 C.链中 D.以上都可以

解析:A

由于在队头做出队操作,为了便于删除队头元素,故总是选择链头作为队头

题目:假设循环单链表表示的队列长度为n,队头固定在链表表尾,若只设头指针,则进队操作的时间复杂度为().

A. O(n) B. O(1) C. O(n^2) D. O(nlog2n)

解析:A

​ 依题意,进队操作是在队尾进行的,即单链表表头。题中已明确说明只设有头指针,也就是没有头结点和尾指针,进队后,循环单链表须保持循环的性质,在只带头指针的循环单链表中寻找表尾结点的时间复杂度为O(n),故进队的时间复杂度为O(n)

题目:栈的应用不包括()

A.递归 B.进制转换 C.迷宫求解 D.缓冲区

解析:D

缓冲区是用队列实现的

题目:下面()用到了队列

A.括号匹配 B.迷宫求解 C.页面替换算法 D.递归

解析:C

页面替换算法中的FIFO用到了队列。其余的都只用到了栈

题目:为解决计算机主机与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是()

A栈 B.队列 C.树 D.图

解析:B

在提取数据的时候必须保持原来数据的顺序,所以缓冲区的特性是先进先出

题目:对n阶对称矩阵压缩存储时,需要表长为()的顺序表。

A. n/2 B. n×n/2 C. n(n+1)/2 D. n(n-1)/2

解析:C

对于对称矩阵的压缩存储,只需存储其对应的上三角或者下三角矩阵即可,元素个数为n+(n-1)+(n-2)+…+1=n(n+1)/2。

题目:将一个A[1..100][1..100]的三对角矩阵,按行优先存入一维数组B[1..298]中,A中元素A[66][65]在数组B中的位置k为()

A. 198 B.195 C.197 D.196

解析:B
对于三对角矩阵,将A[1...n][1...n]压缩至B[1…3n-2]时,aij与 bk的对应关系为k=2i+j-2。则A中的元素A[66][65]在数组B中的位置k为2×66+65-2=195。

题目:适用于压缩存储稀疏矩阵的两种存储结构是()

A.三元组表和十字链表 B.三元组表和邻接矩阵 C.十字链表和二叉链表 D.邻接矩阵和十字链表

解析:A

​ 三元组表的结点存储了行row、列col、值value三种信息,是主要用来存储稀疏矩阵的一种数据结构。十字链表将行单链表和列单链表结合起来存储稀疏矩阵。邻接矩阵空间复杂度达O(n^2),不适于存储稀疏矩阵。二叉链表又名左孩子右兄弟表示法可用于表示树或森林。因此A正确。

知识点

终端结点
/*
	非终端结点:度不为0的结点称为非终端结点或分支结点。
	终端结点:  度为0的结点称为终端结点或叶子。
*/

做题公式
/*
	结点数 = 度为0结点个数 + 度为1 + 度为n
		  = 边数 + 1
	结点数 = N0 + N1 + N2 + ...... + Nn
		  = 1 + N1 + 2N2 + 3N3 + ......+ nNn
	n结点二叉树高度 = log2N + 1
*/
树的度
/*
	一棵树的度指其中节点的度最大值
	结点的度数就是结点的孩子数
*/
二叉树
/*
	N0 = N2 + 1
*/
线索二叉树
/*
	对二叉树以某种遍历顺序进行扫描并为每个节点添加线索的过程称为二叉树的线索化,进行线索化的目的是为了加快查找二叉树中某节点的前驱和后继的速度。 那么在有N个节点的二叉树中需要利用N+1个空指针添加线索。这是因为在N个节点的二叉树中,每个节点有2个指针,所以一共有2N个指针,除了根节点以外每一个节点都有一个指针从它的父节点指向它,所以一共使用了N-1个指针。所以剩下2N-(N-1)个空指针。
	
	先序线索二叉树找不到先序前驱
	后序线索二叉树找不到后序后继
*/
AVL树:自平衡二叉查找树(Adelson-Velsky and Landis Tree)
/*
	AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。

*/
平衡二叉树的插入
/*
	若插入一棵树导致一个结点不平衡了,从不平衡结点开始沿着新插入的结点的方向选择三个结点.
	三个结点:左根右(最小值,中间值,最大值)
*/

题目

题目:对于一棵具有n个结点、度为4的树来说()

A.树的高度至多是n-3 B.树的高度至多是n-4 C.第i层上至多有4(i-1)个结点 D.至少在某一层上正好有4个结点

解析:A
要使得具有n个结点、度为4的树的高度最大,那么就要使得每一层的结点数尽可能的少,除了最后一层外,每一层的结点数是1,最终该树的高度为n-3。树的度为4只能说明某一结点正好(也是最多)有4个子结点,D错误。

题目:在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是( )

A.41 B.82 C.113 D.122

解析:B
设树中度为i(i=0、1、2、3、4)的结点数分别为Ni,树中结点总数为N,则N=分支数+1,而分支数又等于树中各结点的度之和,即 N = 1 + N1 + 2N2 + 3N3 + 4N4 = N0 + N1 + N2 + N3 + N4。依题意,可得出N0 = 82

题目:度为2的有序树就是二叉树(错误)

解析:
二叉树是有序树,在二叉树中,如果某个结点只有一个孩子结点,这个孩子结点的左右次序是确定的;而在度为2的有序树中,如果某个结点只有一个孩子结点,这个孩子结点就无须区分其左右次序。因此度为2的有序树不是二叉树

题目:具有10个叶子结点的二叉树中有()个度为2的结点

A.8 B.9 C.10 D.11

解析:B
利用归并的思想(每次归并两个结点)从下向上画树的结构。注意:不能固有思维即完全二叉树

题目:设二叉树有2n个结点,且 m<n,不可能存在()的结点

A. n个度为0 B. 2m个度为0 C. 2m个度为1 D. 2m个度为2

解析:C
N0 = N2 + 1,结点数 = 2n = n0 + n1 + n2 = 1 + n1 + 2n2,得出n1 = 2(n-n2)-1,所以n1为奇数,不可能有2m个结点

题目:设二叉树只有度为0和2的结点,其结点个数为15,则该二叉树的最大深度为()

A.4 B.5 C.8 D.9

解析:C
第一层一个结点,其余h-1层上各有两个结点,总结点数 = 1 + 2(h - 1)= 15,h = 8

题目:一颗完全二叉树上有1001个结点,其中叶结点的个数是()

A.250 B.500 C.254 D.501

解析:D
方法一:由完全二叉树的性质,最后一个分支结点的序号为[1001/2]=500,故叶子节点个数501
方法二:n=n0 + n1 + n2 = 2n0 + n1 - 1,因为n=1001,而在完全二叉树中n1只能取0/1。当n1=1时,n0为小数不符合。所以n1=0,故n0=501

题目:一颗124个叶子结点的完全二叉树,最多有()个结点

A.247 B.248 C.249 D.250

解析:B
在非空的二叉树当中,由度为0和2的结点数的关系N0=N2+1可知N2=123,总结点数N = N0 + N1 + N2 = 247 + N1其最大值为248(N1的取值为1或0,当N1=1时结点最多)。注意,由完全二叉树总结点数的奇偶性可以确定N1的值,但不能根据N0来确定的N1值。

题目:在二叉树中有两个结点m和n,如果m是n的祖先,使用()可以找到从m到n的路径。

A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历

解析:C
如果采用在后序遍历退回时访问根结点,就可以从下向上把从n到m的路径上的结点输出,非递归的算法,当后序遍历访问到n时,栈中把从根到n 的父指针的路径上的结点都记忆下来,也可以找到从m到n的路径。

题目:若一棵二叉树的前序遍历a,e,b,d,c,后序遍历b,c,d,e,a,则根结点的孩子结点()

A.只有e B.有e、b C.有e、c

解析:A
前序序列和后序序列不能唯一确定一棵二叉树,但可以确定二叉树中结点的祖先关系:当两个结点的前序序列为XY 与后序序列为YX时,则X为Y的祖先。考虑前序序列a,e,b,d,c、后序序列b,c,d,e,a,可知a为根结点,e为a的孩子结点;此外,a的孩子结点的前序序列e,b,d,c、后序序列b,c,d,e,可知e是bcd的祖先,故根结点的孩子结点只有e。故选A。

题目:若一棵二叉树的前序遍历序列和后序遍历序列分别为1,2,3,4和4,3,2,1,则该二叉树的中序遍历序列不会是().

A. 1,2,3,4 B.2,3,4,1 C.3,2,4,1 D.4,3,2,1

解析:C
前序序列为根左右,后序序列为左右根。由于前后序列相反,不可能存在一个结点同时存在左右孩子,即二叉树高度为4。由于根结点只能有一个孩子,因此在中序序列中,1只能在序列首或序列尾部。考虑以2为根的树2,3,4,同样2必须是2,3,4的首部或尾部,只有C不满足

题目:引入线索二叉树的目的是()

A.加快查找结点的前驱或后继的速度 B.为了能在二叉树中方便插入和删除
C.为了能方便找到双亲 D.使二叉树的遍历结果唯一

解析:A
线索是前驱结点和后继结点的指针,引入线索的目的是加快对二叉树的遍历。

题目:线索二叉树是一种()结构。

A.逻辑 B.逻辑和存储 C.物理 D.线性

解析:C
二叉树是一种逻辑结构,但线索二叉树是加上线索后的链表结构,也就是说,它是二叉树在计算机内部的一种存储结构,所以是一种物理结构

题目:n个结点的线索二叉树上含有的线索数为()

A.2n B.n-1 C.n+1 D.n

解析:C
n个结点共有链域指针2n个,其中,除根结点外,每一个结点都被一个指针指向。剩余的链域建立线索,共 2n-(n-1)=n+1个线索。

题目:判断线索二叉树中*p结点有右孩子结点的条件是()

A.p!=NULL B.p->rchild=NULL C. p->rtag0 D. p->rtag1

解析:C
线索二叉树中用ltag/rtag标识结点的左/右指针域是否为线索,当其值为1时,则对应指针域为线索,其值为0时,则为左/右孩子。

题目:线索二叉树中每个结点通过线索都可以直接找到它的前驱和后继(错误)

解析:
不是每个结点通过线索都可以直接找到它的前驱和后继。在先序线索二叉树中查找一个结点的先序后继很简单,而查找先序前驱必须知道该结点的双亲结点。同样,在后序线索二叉树中查找一个结点的后序前驱也很简单,而查找后序后继也必须知道该结点的双亲结点,二叉链表中没有存放双亲的指针。

题目:二叉树在线索化后,仍不能有效求解的问题是( )。

A.先序线索二叉树中求先序后继 B,中序线索二叉树中求中序后继
C.中序线索二叉树中求中序前驱 D.后序线索二叉树中求后序后继

解析:D
后序线索二叉树中不能有效解决求后序后继的问题。如右图所示,结点E的右指针指向右孩子,而在后序序列中E的后继结点为B,在查找E的后继时后序线索不能起到任何作用,只能按常规方法来查找。

题目:若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为().

A.X的双亲 B.X的右子树中最左的结点
C.X的左子树中最右结点 D.X的左子树中最右叶结点

解析:C
在二叉中序线索树中,某结点若有左孩子,则按照中序“左根右”的顺序,该结点的前驱结点为左子树中最右的一个结点(注意,并不一定是最右叶子结点)。

题目:()的遍历需要栈的支持

A.前序线索树 B.中序线索树 C.后序线索树 D.所有线索树

解析:C
后序线索树遍历时,最后访问根结点,如果是从右孩子x返回访问父结点,由于结点x的右孩子不一定为空(右指针无法指向其后继),因此通过指针可能无法遍历整棵树。

题目:先序序列为a,b,c,d的不同二叉树的个数是()。

A.13 B. 14 C.15 D. 16

解析:B
根据二叉树前序遍历和中序遍历的递归算法中递归工作栈的状态变化得出:前序序列和中序序列的关系相当于以前序序列为入栈次序,以中序序列为出栈次序。因为前序序列和中序序列可以唯一地确定一棵二叉树,所以题意相当于“以序列a,b.c,d为入栈次序,则出栈序列的个数为?”,对于n个不同元素进栈,出栈序列的个数为1/(n+1)*C(n, 2n),公式中C表示从2n中选择n个

题目:含有20个结点的平衡二叉树的最大深度()

A.4 B.5 C.6 D.7

解析:C
平衡二叉树结点数的递推公式为N1 = 1,N2 = 2,N[h] = 1 + N[h-1] + N[h-2],h表示高度,N[h]表示构造此高度的平衡二叉树所需最少结点数。通过公式计算,N[5] = 12,N[6] = 20

题目:在有n个叶子结点的哈夫曼树中,非叶子结点的总数()

A. n-1 B.n C. 2n-1 D.2n

解析:A
方式一:由哈夫曼树的构造过程可知,哈夫曼树中只有度为0/2的结点。N = 2N2 + 1;N = N0 + N2
方式二:n个结点构造哈夫曼树需要n-1次合并过程,每次合并产生一个分支结点

题目:下列编码中()不是前缀码

A.{00,01,10,11} B.{0,1,00,11} C.{0,10,110,111} D.{10,110,1110,1111}

解析:B
如果没有一个编码是另一个编码的前缀,称这样的编码为前缀编码

题目:设哈夫曼编码的长度不超过4,若已对两个字符编码为1和01,则还最多可对()个字符编码。

A.2 B.3 C.4 D.5

解析:C
前缀不能是1/01,前两位只能是00,长度不超过4。可能情况有:0000,0001,0010,0011

题目:一棵哈夫曼树共有215个结点,对其进行哈夫曼编码,共能得到()个不同的码字。

A.107 B.108 C.214 D.215

解析:B
根据公式N = 2N2 + 1;N = N0 + N2`计算叶子结点数108个

题目:若度为m的哈夫曼树中,叶子结点个数为n,则非叶子结点的个数为()

A.n-1 B.[n/m]-1(此处中括号表示下取整)
C.[(n-1)/(m-1)](此处中括号表示上取整) D.[n/(m-1)]-1(此处中括号表示上取整)

解析:C
一颗度为m的哈夫曼树应只有度为0和m的结点。N = N0 + Nm;N = m*Nm + 1

题目:下列选项给出的是从根分别到达两个叶结点路径上的权值序列,能属于同一棵哈夫曼树的是()

A.24,10,5和24,10,7 B.24,10,5和24,12,7
C.24,10,10和24,14,11 D.24,10,5和24,14,6

解析:D
哈夫曼树中,左右孩子权值之和为父结点权值

知识点

名词解释

回路:	起点终点相同
简单回路: 除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路
简单路径: 在路径序列中,顶点不重复的路径
  
生成树: 生成树是连通图的包含图中的所有顶点的极小连通子图
    
连通分量: 无向图中的一个子图,其中的任意两个顶点都可以通过路径相互到达
极大连通子图: 指其中的顶点和边组成的子图,它是连通子图,并且再加上任意一个不在该子图中的顶点或边就不能构成连通子图了
    
强连通图: 在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图
    
AOV网: 用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network),AOV网中的弧表示活动之间的某种约束关系
AOE网: 顶点表示事件,用弧表示活动,用弧上的权值表示活动持续的时间,这种有向图的弧表示活动的网,我们称为AOE网(Activity On Edge Network)
    
十字链表: 十字链表法仅适用于存储有向图和有向网
临界多重表: 邻接多重表仅适用于存储无向图或无向网
    
单源最短路径: 给定源顶点分别到其他顶点的最短路径的问题。

图论算法

/*	迪杰斯特拉(Dijkstra)	*/
计算图中的最短路径时,需要指定起点s(即从顶点s开始计算).此外,引进两个集合S和U,S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是起点s到该顶点的路径.然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径.然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径.重复该操作,直到遍历完所有顶点。

题目

题目:以下关于图的叙述中,正确的是()

A.图与树的区别在于图的边数大于或等于顶点数
B.设有图G={V,{E}},顶点集V包含于V, E'包含于E,则V'{B}构成G的子图
C.无向图的连通分量指无向图中的极大连通子图
D.图的遍历就是从图中某一顶点出发访遍图中其余顶点

解析:C
E'中的边对应的顶点不是V'的元素时,V'{E'}无法构成图,B错误;无向图的极大连通子图称为连通分量,C正确;若图非连通,从某一顶点出发,无法访问其他全部顶点,D错误

题目:若无向图G=(V, E)中含有7个顶点,要保证图在任何情况下都是连通的,则需要的边数最少是()

A.6 B.15 C.16 D.21

解析:C
考虑最极端情况,图G的6个顶点构成一个完全无向图,再加上一条边后,这7个顶点必然构成连通图,所以最少边数6*5/2 + 1 = 16

题目:设有无向图G=(V, E)和G’=(V’,E),如果G’是G的生成树,则下列不正确的是()

I.G’为G的连通分量 II.G’为G的无环子图 Ⅲ.G’为G的极小连通子图且V’=V

A.I、ll B只有Ⅲ C.Ⅱ、Ⅲ D.只有I

解析:D
一个连通图的生成树是一个极小连通子图,显然是无环的,Ⅱ、Ⅲ正确。极大连通子图成为连通分量,G’连通但并非连通分量。如果图本来就不是连通的,那么每个子部分如果包含它本身的所有顶点和边,那么它就是极大连通子图

题目:如果具有n个顶点的图是一个环,则它有()棵生成树。

A.n^2 B.n C. n-1 D.1

解析:B
n个顶点构成的环共有n条边,去掉其中任意一条便是一棵生成树,所有有n种情况

题目:带权有向图G用邻接矩阵存储,则v的入度等于邻接矩阵中( )

A.第i行非∞的元素个数 B.第i列非o的元素个数
C.第i行非∞且非0的元素个数 D.第i列非∞且非0的元素个数
解析:D
有向图的邻接矩阵中,0和∞表示的都不是有向边

题目:假设有n个顶点e条边的有向图用邻接表表示,则删除与某个顶点v相关的所有边的时间复杂度为()

A. O(n) B. O(e) C. O(n+e) D. O(ne)

解析:C
删除下标为v的顶点表结点的单链表,时间复杂度为O(n);扫描所有边表结点,删除所有的顶点v的入边,时间复杂度为O(e);故总的时间复杂度为O(n+e)

题目:下列关于广度优先算法的说法正确的是()

Ⅰ.当各边的权值相等时,广度优先算法可以解决单源最短路径问题
Ⅱ.当各边的权值不等时,广度优先算法可用来解决单源最短路径问题
Ⅲ.广度优先遍历算法类似于树中的后序遍历算法
Ⅳ.实现图的广度优先算法时,使用的数据结构是队列

A.Ⅰ、Ⅳ B.Ⅱ、Ⅲ、Ⅳ C.II、Ⅳ D.I、Ⅲ、Ⅳ

解析:A
广度优先搜索是以起始结点为中心,一层一层向外层扩展遍历图的顶点,因此无法考虑到边权值,只适合求边权值相等的图的单源最短路径。广度优先搜索相当于树的层序遍历,Ⅲ错误。广度优先搜索需要用到队列,深度优先搜索需要用到栈,Ⅳ正确。

题目:对一个有n个顶点e条边的图采用邻接表表示时,进行DFS遍历的时间复杂度为(),空间复杂度为();进行BFS遍历的时间复杂度为(),空间复杂度为()

A.O(n) B. O(e) C.O(n+e) D.O(1)

解析:C、A、C、A
深度优先遍历时,每个顶点表结点和每个边表结点均查找一次,每个顶点递归调用一次,需要借助一个递归工作栈;而广度优先时也是每个顶点表结点和每个边表结点均查找一次,每个顶点进入队列一次。故而都是选C,A。

题目:对于有n个顶点e条边的图采用邻接矩阵表示时,进行DFS遍历的时间复杂度为()进行BFS遍历的时间复杂度为()

A.O(n^2) B.O(e) C. O(n+e) D. O(e^2)

解析:A、A
采用邻接矩阵表示时,查找一个顶点所有出边的时间复杂度为O(n),共有n个顶点,故时间复杂度均为O(n^2)。

题目:设无向图G=(V, E)G'=(V', E'),如果G’是G的生成树,则下列说法中错误的是()

A.G’为G的子图 B.G’为G的连通分量 C.G’为G的极小连通子图且V=V’ D.G’是G的一个无环子图

解析:B
连通分量是无向图的极大连通子图,其中极大的含义是将依附于连通分量中顶点的所有边都加上,所以,连通分量中可能存在回路,这样就不是生成树了。

题目:用Prim算法和KrusKal算法构造图的最小生成树,所得到的最小生成树()

A.相同 B.不相同 C.可能相同,可能不同 D. 无法比较

解析:C
由于无向连通图的最小生成树不一定唯一,所以用不同算法生成的最小生成树可能不同,但当无向连通图的最小生成树唯一时,不同算法生成的最小生成树必定是相同的。

题目:下列关于最小生成树的叙述中,正确的是()

I. 最小生成树的代价唯一
II. 所有权值最小的边一定会出现在所有的最小生成树中
Ⅲ. 使用普里姆(Prim)算法从不同顶点开始得到的最小生成树一定相同
IV. 使用普里姆算法和克鲁斯卡尔(Kruskal)算法得到的最小生成树总不相同

A. 仅Ⅰ B. 仅Ⅱ C. 仅Ⅰ、Ⅲ D. 仅Ⅱ、Ⅳ

解析:A
最小生成树的树形可能不唯一(这是因为可能存在权值相同的边),但是代价一定是唯一的,Ⅰ正确。
如果权值最小的边有多条并且构成环状,则总有权值最小的边将不出现在某棵最小生成树中,Ⅱ错误。
设N个结点构成环,N-1条边权值相等,则从不同的顶点开始普里姆算法会得到N-1中不同的最小生成树,Ⅲ错误。
当最小生成树唯一时(各边的权值不同),普里姆算法和克鲁斯卡尔算法得到的最小生成树相同,Ⅳ错误。

题目:以下叙述正确的是()

A.最短路径一定是简单路径
B. Dijkstra算法不适合求有回路的带权图的最短路径
C. Dijkstra算法不适合求任意两个顶点的最短路径
D. Floyd算法求两个顶点的最短路径时,pathk-1一定是pathk的子集

解析:A
Dijkstra算法适合求解有回路的带权图的最短路径,也可以求任意两个顶点的最短路径,不适合求带负权值的最短路径问题。在用Floyd算法求两个顶点的最短路径时,当最短路径发生更改时,pathk-1就不是pathk的子集。

题目:下面哪一方法可以判断出一个有向图是否有环(回路)

Ⅰ. 深度优先遍历 Ⅱ.拓扑排序 Ⅲ.求最短路径 Ⅳ.求关键路径

A. I、Ⅱ、Ⅳ B. I、Ⅲ、Ⅳ C.I、Ⅱ、Ⅲ D.全部可以

解析:A
最短路径是允许有环的
关键路径本身虽然不允许有环,但求关键路径的算法本身无法判断是否有环,判断是否有环的是关键路径的第一步——拓扑排序

题目:若将n个顶点e条弧的有向图采用邻接表存储,则拓扑排序算法的时间复杂度是()

A. O(n) B.O(n+e) c. O(n2) D. O(n*e)

解析:B
采用邻接表作为AOV网的存储结构进行拓扑排序,需要对n个顶点做进栈、出栈、输出各一次,在处理e条边时,需要检测这n个顶点的边链表的e个边结点,总共需要的时间代价为O(n+e)。若采用邻接矩阵作为AOV网的存储结构进行拓扑排序,在处理e条边时需要对每一个顶点检测相应矩阵中的某一行,寻找与它相关联的边,以便对这些边的入度减1,需要的时间代价为O(n^2)。

题目:如果有向无环图的拓扑序列唯一,则可以唯一确定该图(错误)

解析:有图{<V1,V2>,<V1,V3>,<V2,V3>,<V2,V4>,<V3,V4>}和图{<V1,V2>,<V2,V3>,<V3,V4>}

两个图拓扑序列都为V1->V2->V3->V4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值