数据机构之 期末总复习题
一、 判断题
1、 顺序存储的线性表可以随机存取。( √ )
2、 在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。( √ )
3、 线性结构的基本特征是每个结点至多只有一个直接前驱和一个直接后继( √ )。
4、 线性表的线性存储结构优于链表存储结构。( X )
5、 所谓循环队列指的是队列的存储结构是循环链表( X )。
6、 将一棵树转化为二叉树后,这棵二叉树的根结点没有右子树( √ )。
解析:树转化为二叉树时结点左子树是原来的孩子结点,右子树是原来的兄弟结点。即取根节点左孩子向右连接他的兄弟结点(在同一层次的节点,原来互不相连)并把它的子树,而把除左孩子外,原来与根节点相连的线擦除。这样根节点没有右孩子,因为由树转化来的二叉树某个节点A的左子树是原来作为树时A的孩子,其右子树是他的兄弟
7、 完全二叉树的某结点若无左孩子,则必定是叶子结点。( √ )
解析:对完全二叉树的编号是由上而下,由左而右进行的,所以若某节点无左孩子,则必然无右孩子。即为叶子结点。
8、 二叉树的前序遍历序列中,任意一个结点均处在其子树结点的前面。( √ )
9、 二叉树的前序和后序遍历序列能惟一确定这棵二叉树。( X )
解析:1.这里需要注意的是,两个序列中必须有一个中序序列才可以。 前序和后续组合无法确定唯一二叉树.
2.给出一个中序序列,再给一个前序或后续序列,则可以确定一个个唯一的二叉树。
10、 在无向图中,边的条数是结点度数之和。( X )
解析:是度的和除2;
11、 图的邻接矩阵必定是对称矩阵。( X )
12、 顺序查找并不要求关键码一定有序。( √ )
二、 选择题
- 计算机算法指的是( C ),它必具备输入、输出和( F )5个特性。
A.计算方法
B.排序方法
C.解决问题的有限运算序列
D.调度方法
E.可行性、可移植性和可扩充性
F.可行性、确定性和有穷性
G.确定性、有穷性和稳定性
H.易读性、稳定性和安全性
- 算法分析的目的是( C ),算法分析的两个主要方面是( E )。
A.给出数据结构的合理性
B.研究算法中的输入和输出的关系
C.分析算法的效率以求改进
D.分析算法的易懂性和文档性
E.空间复杂性和时间复杂性 F.正确性和简明性
G.可读性和文档性 H.数据复杂性和程序复杂性
- 算法与程序的主要区别在于算法必须满足( D )。
A、先进性 B、正确性 C、高效性 D、有穷性
- 若长度为n的无序线性表采用顺序存储结构,在其中插入某个元素的平均移动次数为( C )。
A、n B、( n - 1 ) / 2 C、n / 2 D、( n + 1 ) / 2
- 有头结点单循环链表以first为表头指针,设next为链表的指针域,则链表为空的条件为( B)。
A、 first -> next = = first B、first -> next = = NULL
C、first = = NULL D、first != NULL
- 在单链表中,若要在指针p所指结点后面插入一个由指针q所指结点,设next域存放指针,则执行的语句系列是( B )。
A、p -> next = q -> next; q = p;
B、q -> next = p -> next; p -> next = q;
C、p-> next = q -> next; q -> next = p;
D、p -> next = q; q -> next = p -> next;
- 假设一个循环顺序队列的队首和队尾指针分别为front和rear,存储空间大小为n,则判断队空的条件是( B )。
A、( front + 1 ) % n = = rear B、front = = rear
C、( rear + 1 ) % n = = front D、front = = 0
8. 如果将一棵有n个结点的完全二叉树按层次遍历次序,存放在下标编号为0, 1, … , n-1的一维数组中,设某结点下标为k( k >= 0 ),如果其左孩子存在,则其左孩子结点的下标是( C )。
A、2k - 1 B、2k C、2k + 1 D、2k + 2
- 由某树等价转换得到的二叉树称为该树对应的二叉树,则以下结论正确的是( A )。
A、树的先根遍历序列与其对应二叉树的前序遍历序列相同
B、树的先根遍历序列与其对应二叉树的中序遍历序列相同
C、树的后根遍历序列与其对应二叉树的前序遍历序列相同
D、树的后根遍历序列与其对应二叉树的后序遍历序列相同
- 如右所示由7个顶点组成的无向图,从顶点1出发,对它进行深度优先遍历不可能得到的顶点序列是( D )。
A、1245367 B、1467253
C、1342765 D、1534267
- 将长度为m的单链表接在长度为n的单链表之后的算法的时间复杂度为( B)。
A.O(m+n) B.O(n) C.O(m) D.(m*n)
- 在一个具有10个顶点的有向图中,所有顶点的入度之和与所有顶点的出度之和的差为( C )。
A.10 B.20 C. 0 D.5
- 一个线性表第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是( B )。
A. 110 B. 108 C. 100 D. 120
- 在具有n(n>l)个结点的完全二叉树中,结点i (2i>n)的左孩子结点( C )
A.是2i B.是2i+l
C.不存在 D.是2i-l
- 对二叉树从1开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用( C )次序的遍历实现编号。
A.先序 B. 中序 C. 后序 D. 从根开始的层次遍历
- 二分查找要求结点( A )。
A.有序、顺序存储 B.有序、链接存储
C.无序、顺序存储 D.无序、链接存储
- 设有100个元素,用折半查找法进行查找时,最大比较次数是( D )。
A.25 B.50 C.10 D.7
- 设有一个堆栈,元素进栈的次序为abcde,进栈的中间可以出栈,。不可能得到( C )出栈序列:
A.abcde B.edcba C.decab D.dceba
- 设T是哈夫曼树,具有5个叶子结点,树T的高度最高可以是( D )。
A.2 B.3 C.4 D.5
解析:
- 如图所示,若从顶点a出发对图按广度优先搜索法进行遍历,则可能得到的一种顶点序列为( B )。
A.abcedf B.abcefd C.abedfc D.acfdeb
三.简答题
1.已知某二叉树的结点的后序序列是BDCGFEA, 中序序列是BCDAEGF。
(1)画出该二叉树,(2)求前序遍历序列。
解析(1)
(2)ACBDEFG
2.设A~H 8个字符出现的概率为:w={0.10,0.16,0.01,0.02,0.29,0.10,0.07,0.25},设计最优二进制码并计算带权路径长度WPL。
A:101
B:001
C:00000
D:00001
E:01
F:101
G:0001
H:11
WPL = 3 × (0.1+0.16+0.1) + 5 × (0.01 + 0.02) + 2 × (0.29 + 0.25) + 4 × 0.07= 2.59
3.图G的邻接表如下,求出其拓扑序列。
解:
其拓扑序列如下(不是惟一):
1 2 4 5 8 9 10 3 6 11 7 12
l 2 4 5 8 9 10 3 7 6 11 12
4.已知无向图G如下,请写出从顶点1出发,采用深度优先搜索算法进行遍历得到的顶点序列。
解:
1 4 5 2 3 7 6 8 9
1 7 8 9 6 2 3 5 4
5.有41条弧的有向连通图,至少有几个顶点,至多有几个顶点?有41条弧的有向非连通图,至少有几个顶点?为什么?
知识点
解:
6个顶点的有向图最多有6×(6-1)= 30条弧,即有向完全图。
显然,具有41条弧的有向连通图至少有7个顶点。至多有41个顶点,这些顶点连成一个环。
有条41弧的有向非连通图,至少有8个顶点,其中7个顶点构成强连通分量,另加1个孤立顶点。
6.画出和下列已知序列对应的森林:
森林的先序次序访问序列为:ABCDEFGHIJKL;
森林的中序次序访问序列为:CBEFDGAJIKLH。
食用方法:
(1)、从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连续删除。直到所有这些根结点与右孩子的连线都删除为止。
(2)、将每棵分离后的二叉树转换为树。
(3)左孩子不动,将右孩子变成爷爷根的右孩子
7.图G的邻接矩阵如下所示:
试画出该图,并使用Kruskal算法构造出一棵最小生成树。
解:
8.判断下列序列是否为堆(大根堆或小根堆)。若不是,则将其调整为堆(大根堆或小根堆)。
(43,5,47,1,19,11,59,15,48,41)
序列不是堆。注意要从排无序堆开始,从最后一个非终端结点开始,自下而上调整。
9.利用Dijkstra算法求下图中V1到V6的最短路径,并计算出数组D在算法执行过程中的每一步的变化。(D[i]表示当前所找到的从V1到每个顶点的最短路径长度)
四.算法题
1.设顺序存储的线性表la的数据结构定义如下。编写一个算法删除la中所有值为x的数据元素。
typedef struct{
DataType list [ Maxnum ];
int length;
}SeqList;
void DeleteSeqList ( SeqList *la , DataType x ){
for ( j = 0 ; j < la -> length ; j++ ){
if ( la -> list[ j ] = = x ){
for ( k = j ; k < la -> length – 1 ; k++ )
la -> list [ k ] = la -> list [ k+1 ];
la -> length --;
j --;
}
}
}
2、 编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。
typedef struct Node{
char data ;
struct Node *lchild , * rchild ;
}BinNode , * BinTree ;
void preorder(BinTree root , int *pnum , int k , int *tag ){
/* preorder visit bittree and output the NO.k node */
if ( root ! = NULL ){
( *pnum ) ++ ;
if ( *pnum = = k){
printf ( "\nThe NO.%d node by preorder is %c." , k , root->data ) ;
*tag = 1 ;
}
preorder ( root->lchild , pnum , k , tag ) ;
preorder ( root->rchild , pnum , k , tag ) ;
}
个人觉得:算法少了一步东西,,,虽然能实现要求,但是优化的地方还是有的。