数据结构第二次月测
判断题:
- 存在一棵总共有2016个结点的二叉树,其中有16个结点只有一个孩子。×
- 在任一有向图中,所有顶点的入度之和等于所以顶点的出度之和。 √ 有一个入就有一个出
- 将一棵完全二叉树存于数组中(根节点的下标为1)。则下标为23和24的两个结点是兄弟。 × 下标在1开始,2n与2n+1是兄弟
- 已知一棵二叉树的先序遍历结果为ABC,则CAB不可能是中序遍历结果。 √ 应该是BAC
- Prim算法是通过每步添加一条边及其相连的顶点到一棵树,从而逐步生产最小生成树。 √
- 无向连通图所有顶点的度之和为偶数。 √ 入度等于出度 度数和=入度+出度=2*入度 偶数
- 如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G中一定有回路。 × 不一定 还可能存在2个连通分量
- 用领接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。 × 邻接表与边和点均有关
- 在一个有权无向图中,若b到a的最短路径距离是12,且c到b之间存在一条权为2的边,则c到a的最短路径距离一定不小于10. √ 如果小于最短路径就变了
- 对N(>=2)个权值均不相同的字符构造哈夫曼树,则树中任一非叶子结点的权值一定不小于下一层任一结点的权值。 √ 上一层值是孩子树的结点和,所以一定大于等于
选择题:
1.我们用一个有向图来表示航空公司所有航班的航线。下列哪种算法最适合解决找给定两城市间最经济的飞行路线问题? D
A.拓扑排序算法
B.Kruskal算法
C.深度优先搜索
D.Dijkstra算法
2.在AOE网中,什么是关键路径? (2分) A
A.从第一个事件到最后一个事件的最长路径
B.最短回路
C.最长回路
D.从第一个事件到最后一个事件的最短路径
3.下图为一个AOV网,其可能的拓扑有序序列为: (2分) C
A.ACBDEF
B.ABCEFD
C.ABCEDF
D.ABCDFE
根据中序和后序还原,这棵树不是完全二叉树
4.树最适合于用来表示 (2分) B
A.有序数据元素
B.元素之间具有分支层次关系的数据
C.无序数据元素
D.元素之间无联系的数据
5.任何一个带权无向连通图的最小生成树—— (2分) C
A.是不唯一的
B.是唯一的
C.有可能不唯一
D.有可能不存在
6.给定有向图的邻接矩阵如下:
顶点2(编号从0开始)的出度和入度分别是:(2分) C
A.3, 1
B.1, 3
C.0, 2
D.2, 0
行为出度 列为入度
7.设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数? (2分)
A.0
B.4
C.5
D.2
8.设树T的度为4,其中度为1、2、3、4的结点个数分别为4、2、1、1。则T中有多少个叶子结点? (2分) B
A.6
B.8
C.4
D.10
9.序遍历图示二叉树的结果为 (2分) B
A.A,B,C,D,H,E,I,F,G
B.A,B,D,H,I,E,C,F,G
C.H,D,I,B,E,A,F,C,G
.H,I,D,B,E,F,G,A,C
10.若一棵二叉树的后序遍历序列是{ 1, 3, 2, 6, 5, 7, 4 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?(2分) A
A.这是一棵完全二叉树
B.2是1和3的父结点
C.这是一棵二叉搜索树
D.7是5的父结点
编程题:
R7-1 列出所有祖先结点
对于给定的二叉树,本题要求你按从上到下顺序输出指定结点的所有祖先结点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。
随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。
最后一行给出一个结点的编号i(0≤i≤N-1)。
输出格式:
在一行中按规定顺序输出i的所有祖先结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 -
- 6
- -
0 5
- -
4 1
- -
4
输出样例:
3 5
R7-2 顺序存储的二叉树的最近的公共祖先问题
设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。
输入格式:
输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。
题目保证输入正确对应一棵二叉树,且1≤i,j≤n。
输出格式:
如果i或j对应的是空结点,则输出ERROR: T[x] is NULL
,其中x
是i或j中先发现错误的那个编号;否则在一行中输出编号为i和j的两个结点最近的公共祖先结点的编号和值,其间以1个空格分隔。
输入样例1:
15
4 3 5 1 10 0 7 0 2 0 9 0 0 6 8
11 4
输出样例1:
2 3
输入样例2:
15
4 3 5 1 0 0 7 0 2 0 9 0 0 6 8
12 8
输出样例2:
ERROR: T[12] is NULL
R7-3 排座位
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。
输入格式:
输入第一行给出3个正整数:N
(≤100),即前来参宴的宾客总人数,则这些人从1到N
编号;M
为已知两两宾客之间的关系数;K
为查询的条数。随后M
行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系
,其中关系
为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K
行,每行给出一对需要查询的宾客编号。
这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。
输出格式:
对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem
;如果他们之间并不是朋友,但也不敌对,则输出OK
;如果他们之间有敌对,然而也有共同的朋友,则输出OK but...
;如果他们之间只有敌对关系,则输出No way
。
输入样例:
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
输出样例:
No problem
OK
OK but...
No way