一.判断题
任何最小堆的前序遍历结果是有序的(从小到大)。T
任何最小堆中从根结点到任一叶结点路径上的所有结点是有序的(从小到大)。T
对,最小堆从上到下依次增大
对N(≥2)个权值均不相同的字符构造哈夫曼树,则树中任一非叶结点的权值一定不小于下一层任一结点的权值。T
因为都是自底向上组成的哈夫曼树 那么任一非叶子节点都是两个孩子节点的和 所以大于它自己子树上的任一节点的权值
哈夫曼编码是一种最优的前缀码。对一个给定的字符集及其字符频率,其哈夫曼编码不一定是唯一的,但是每个字符的哈夫曼码的长度一定是唯一的。F
前半句时对的,对于后半句来说;例如a,b,c的权值都为2,那么所生成的哈夫曼树的长度是可以交换的,因为a,b,c,的权值一样;
哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。T
注:图a,WPL=5*2(这里的2是从根节点到子节点的边数)
无向连通图所有顶点的度之和为偶数。T
无向连通图的特性。
Ⅰ.每条边都连接了两个结点,则在计算顶点的度之时,这条边都被计算了两次,故所有顶点的度之和为边数的两倍,显然必为偶数。
Ⅱ.边数大于等于顶点个数减1,如果定点数为3,则边数为2,边数=定点个数减1;
Ⅲ.在顶点数n≥3的完全有向图中,没有度为1的节点,并且边数与顶点数的差要大于等于0。
————————————————
原文链接:https://blog.youkuaiyun.com/Eumenides_Suki/article/details/110141278
无向连通图边数一定大于顶点个数减1。F
无向图*
在无向图中有以下几点结论:1.所有顶点的度数之和 等于 边数的二倍。
2.n个顶点的无向完全图有 n(n-1)/2 条边。
3.n个顶点的连通图至少有 n-1 条边。
用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。F
课本P156:邻接表由两部分组成:表头结点表和边表;
所以用邻接表法存储图,占用的存储空间数只与图中结点个数和边数都有关;
用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。T
对,邻接矩阵法的存储大小为n^2,只与顶点数有关,与边无关
在一个有向图中,所有顶点的入度与出度之和等于所有边之和的2倍。T
在有向图中有以下几点结论:
1.所有顶点的度数之和 等于边数的二倍。
2.所有顶点的入度之和 等于出度之和。
3.n个顶点的有向完全图有n*(n-1)条边。
4.n个顶点的强连通图至少有n条边。
在任一有向图中,所有顶点的入度之和等于所有顶点的出度之和。T
图的深度优先遍历非递归算法通常采用队列实现,广度优先遍历非递归算法通常采用堆栈实现。F
广度优先采用队列实现,深度优先采用堆栈实现
如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G中一定有回路。F
可能有两个连通分量;连通分量
采用邻接表存储的图,其广度优先遍历类似于二叉树的先序遍历。F
类似于层序遍历
若有向图不存在回路,即使不用访问标志位同一结点也不会被访问两次。F
如果一个点的入度大于1的话,就有可能被多次访问
二.单选题
1.堆的形状是一棵:
A.完全二叉树
B.非二叉树
C.满二叉树
D.二叉搜索树
2.创建一个初始堆,含有N个记录,其时间复杂度是:
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N2)
3.哪种树,树中任何结点到根结点路径上的各结点值是有序的?
A.完全二叉树
B.二叉搜索树
C.堆
D.以上都不是
从任一结点出发到根的路径上所经过的结点序列按其关键字有序_从某个节点出发走遍所有节点最后到指定节点_PostgreSQL运维技术的博客-优快云博客
4.将6、4、3、5、8、9顺序插入初始为空的最大堆(大根堆)中,那么插入完成后堆顶的元素为:
A.3
B.6
C.5
D.9
最大堆的堆顶为最大值
5.下列的序列中,哪一组是堆?
A.99,66,22,33,37,13,45,10
B.99,45,66,13,37,10,22,33
C.37,99,45,33,66,10,22,13
D.99,66,45,33,37,10,22,13
6.将数字 {10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7, 4, 11, 13, 2} 逐一插入一个初始为空的最小堆(小顶堆),得到的堆序列为:
A.1,3,2,12,6,4,8,15,14,9,7,5,11,13,10
B.1,3,2,6,7,5,4,15,14,12,9,10,11,13,8
C.1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
D.1,2,3,6,7,5,4,15,14,12,9,10,11,13,8
7.用线性时间复杂度的算法将给定序列{ 28, 12, 5, 8, 19, 20, 15, 22 }调整为最大堆(大根堆),然后插入30。则结果序列为:
A.{ 30, 28, 20, 22, 12, 5, 15, 8, 19 }
B.{ 30, 28, 20, 22, 19, 5, 15, 8, 12 }
C.{ 5, 8, 28, 12, 19, 20, 15, 22, 30 }
D.{ 30, 28, 22, 20, 19, 15, 12, 8, 5 }
8.在下述结论中,正确的是:
① 只有2个结点的树的度为1;
② 二叉树的度为2;
③ 二叉树的左右子树可任意交换;
④ 在最大堆(大顶堆)中,从根到任意其它结点的路径上的键值一定是按非递增有序排列的。
A.①④
B.②③④
C.①②③
D.②④
度是这个树里的最大度数,度为二说明这个树至少有一个度为2,而二叉树里可以没有度为2的节点;
左右子树不可任意交换
9.将 { 10, 12, 1, 14, 6, 5, 8, 15, 3, 9, 7 } 逐个按顺序插入到初始为空的最小堆中,然后连续执行两次删除最小元素操作(DeleteMin),再插入4,16,此后堆顶的元素是什么?
A.9
B.7
C.5
D.4
10.利用过滤法将关键字序列 { 37, 66, 48, 29, 31, 75 } 建成的最大堆为 __
A.75, 48, 66, 37, 29, 31
B.75, 37, 66, 29, 31, 48
C.75, 66, 48, 37, 31, 29
D.75, 66, 48, 29, 31, 37
11.下列关于大根堆(至少含 2 个元素)的叙述中,正确的是:
- (I). 可以将堆看成一棵完全二叉树
- (II). 可以采用顺序存储方式保存堆
- (III). 可以将堆看成一棵二叉排序树
- (IV). 堆中的次大值一定在根的下一层
A.仅 I、II、IV
B.仅 I、II
C.仅 I、III、IV
D.仅 II、III
解析
堆是一棵完全树,采用一位数组存储,故Ⅰ、Ⅱ正确。大根堆只要求根结点值大于左右孩子值,并不要求左右孩子值有序,Ⅲ错误。堆的定义是递归的,所以其左右子树也是大根堆,所以堆的次大值一定是其左孩子或右孩子,Ⅳ正确。
12.将关键字 6、9、1、5、8、4、7 依次插入到初始为空的大根堆 H 中,得到的 H 是:
A.9、6、7、5、8、4、1
B.9、8、7、5、6、1、4
C.9、8、7、5、6、4、1
D.9、8、7、6、5、4、1
13.设一段文本中包含字符{a, b, c, d, e},其出现频率相应为{3, 2, 5, 1, 1}。则经过哈夫曼编码后,文本所占字节数为:
A.25
B.40
C.36
D.12
所占字节数=每个字符的频率 * 对应的哈夫曼编码长度
此题:a:01 ;b:001 ;c:1;d:0000;e:0001长度=3*2 + 2*3 + 1*5 + 4*1 +4*1=25
14.设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数?
A.2
B.5
C.4
D.0
等长编码:此题,有四个对象,则除2,只需2位即可,a:00 ,b:01,c:10,d:11;
总位数=(4+2+5+1)*2=24
哈夫曼编码长度:22
15.设哈夫曼树中有199个结点,则该哈夫曼树中有()个叶子结点。
A.102
B.101
C.99
D.100
二叉树结点总数=N0 + N1 + N2; N0=N2+1;其中哈夫曼树并没有度为1的结点,所以此题中 N0 + N2 = 199,算出来N0=100;
16.已知权值集合为{5,7,2,3,6,1,4},计算带权路径长度WPL()。
A.75
B.7
C.74
D.73
17.以下对于堆和哈夫曼树的描述,错误的是:
A.哈夫曼树的任意非叶节点的左右子(如果非空)树交换后仍是哈夫曼树。
B.对同一组权值{w1 ,w2 , …… , wn},可能存在不同构的两棵哈夫曼树。
C.堆一定是完全二叉树。
D.堆的任意非叶节点的左右子树(如果非空)互换,仍然是堆。
18.由权值分别为8,4,6,5,7的叶子结点生成一棵哈夫曼树,它的带权路径长度为()。
A.90
B.60
C.30
D.69
19.下面几个符号串编码集合中,不是前缀编码的是( )。
A.{b,c,aa,ac,aba,abb,abc}
B.{0,10,110,1111}
C.{11,10,001,101,0001}
D.{00,010,0110,1000}
前缀编码满足任意一个字符的编码都不是另一个字符的编码的前缀.在B中10编码是101编码的前缀,因此不满足前缀编码的要求,故选C
20.以下说法错误的是 ( )。
A.在前序遍历二叉树的序列中,任何结点的子树的所有结点都是直接跟在该结点的之后。
B.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。
C.已知二叉树的前序遍历和后序遍历序列并不能惟一地确定这棵树,因为不知道树的根结点是哪一个。
D.若一个二叉树的树叶是某子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。
已知前序、中序或者中序、后序都可以唯一确定一棵二叉树,但是已知前序、后序是无法唯一确定一棵二叉树的,解不唯一。因为明确父子节点关系
21.设有正文ADDBCBDCCBDCAD,字符集为A,B,C,D,设计一套二进制编码,使得上述正文的编码最短。正确的哈夫曼树(要求左孩子权值小于等于右孩子)以及编码是( )。
A.
A:00 B:01 C:10 D:11
B.
A:011 B:111 C:01 D:0
C.
A:00 B:01 C:0 D:1
D.
A:010 B:011 C:1 D:00
22.若某二叉树有 5 个叶结点,其权值分别为 10、12、16、21、30,则其最小的带权路径长度(WPL)是:
A.208
B.89
C.289
D.200
23.下列关于无向连通图特征的叙述中,正确的是:
- 所有顶点的度之和为偶数
- 边数大于顶点个数减1
- 至少有一个顶点的度为1
A.1和3
B.只有2
C.只有1
D.1和2
1,每条边连接两个顶点,所有顶点的度之和等于边数的2倍,是偶数,正确
2,如两个顶点一条边的图就不满足这个条件,错
3,如三个顶点三条边连成一个三角形的图每个顶点度为2,错
24.具有5个顶点的有向完全图有多少条弧?
A.20
B.25
C.10
D.16
每个顶点能够指向其他顶点构成一条边,5个顶点的话,对于每个顶点,能够与其他4个顶点构成一条边。故结果为5*4 = 20
25.对于一个具有N个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是:
A.(N−1)^2
B.N^2
C.N
D.N−1
链接:https://www.nowcoder.com/questionTerminal/6d2580a441dd42308cfdf0327cb3952c?toCommentId=2415993
来源:牛客网
首先“邻接矩阵”是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn} 。G的邻接矩阵是一个具有下列性质的n阶方阵:①对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。
②在无向图中,任一顶点i的度为第i列(或第i行)所有非零元素的个数,在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个数。
③用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间。
所以选择D
26.给定有向图的邻接矩阵如下:
顶点2(编号从0开始)的出度和入度分别是:
A.3, 1
B.2, 0
C.0, 2
D.1, 3
出度为所在编号那一横全部相加,入度为所在编号那一列全部相加
27.设无向图为 G=(V,E),其中 V={v1,v2,v3,v4},E={(v1,v2),(v3,v4),(v4,v1),(v2,v3),(v1,v3)}。则每个顶点的度依次为:
A.1, 1, 2, 1
B.2, 1, 1, 1
C.2, 3, 2, 3
D.3, 2, 3, 2
28.对于给定的有向图如下,其邻接矩阵为:A
A.
B.
C.
D.
根据每个顶点的出度来画
29.对于给定的有向图如下,其逆邻接表为:D
A.
B.
C.
D.
根据顶点的入度来画邻接表,称为 逆邻接表
30.对于给定的有向图如下,其强连通分量为:
A.
{1}, {2, 3, 4}, {5, 6}
B.
{1}, {2, 3, 4, 6}, {5}
C.
{1}, {2, 4, 6}, {3}, {5}
D.
{1, 2, 3, 4, 5, 6}
强连通分量类型:
如何计算:
31.给出如下图所示的具有 7 个结点的网 G,哪个选项对应其正确的邻接矩阵?
A.
B.
C.
D.
到自身和其他到不了的顶点的距离都是无穷大
32.将一个 10×10 的对称矩阵 M 的上三角部分的元素 mi,j(1≤i≤j≤10)按列优先存入C语言的一维数组 N 中,元素 m7,2 在 N在中的下标是:
A.16
B.15
C.23
D.22
33.给定一有向图的邻接表如下。从顶点V1出发按深度优先搜索法进行遍历,则得到的一种顶点序列为:
A.V1,V5,V6,V4,V7,V2,V3
B.V1,V2,V3,V4,V7,V6,V5
C.V1,V5,V4,V7,V6,V2,V3
D.V1,V5,V4,V7,V6,V3,V2
V1->V5 ;V5 -> V4;V4->V7;V7后为空,递归返回给V5行;继续->V6;V6后为空,递归返回给V1行;继续->V3;V3为空;递归返回给V1行;继续->V2;
综上:得到序列 V1->V5->V4->V7->V6->V3->V2
34.如果从无向图的任一顶点出发进行一次深度优先遍历即可访问所有顶点,则该图一定是____。
A.一棵树
B.连通图
C.有回路
D.完全图
无向图只有连通图,有向图只有强连通图,解释:在图中,有任一两个顶点v1,v2,v1到v2或v2到v1都是连通的就称为连通图或强连通图
35.用邻接表表示图进行深度优先遍历时,通常借助( )来实现算法。
A.树
B.栈
C.队列
D.图
深度用栈,广度用队列
36.给定无向带权图如下,以下哪个是从顶点 a 出发深度优先搜索遍历该图的顶点序列(多个顶点可以选择时按字母序)?
A.abchgfde
B.abcdehgf
C.abecdfhg
D.abcdefgh
从选项来说,D是最优答案
37.给定一个图的邻接矩阵如下,则从V1出发的深度优先遍历序列(DFS,有多种选择时小标号优先)是:
A.V1, V2, V4, V3, V6, V8, V10, V9, V7, V5
B.V1, V2, V4, V6, V8, V10, V9, V7, V5, V3
C.V1, V2, V3, V4, V5, V6, V7, V9, V8, V10
D.V1, V2, V3, V5, V7, V9, V10, V6, V8, V4
38.对下图从顶点C出发进行深度优先搜索,哪个是错误的搜索序列?
A.CDABEHFG
B.CDAEHGFB
C.CBAEFGHD
D.CBADEFGH
A选项错在 HFG ;正确应该为 HGF
39.
以下算法的功能是()。
void graph1( adjmatrix GA, int i, int n, int *visited)
{
int k, j; Queue q;
cout<<i<<‘ ‘; visited[i]= 1;
InitQueue( q);
EnQueue (q, i);
while ( !EmptyQueue(q) ) {
k= OutQueue (q);
for( j=0; j<n; j++) {
if ( GA[k][j] != 0 && GA[k][j] != MaxValue && !visited[j] ) {
cout<<j<<‘ ‘; visited[j] = 1;
EnQueue (q, j);
}
}
}
}
A.从顶点i出发进行深度优先遍历
B.输出顶点i的各邻接点
C.输出从顶点i出发到各顶点的路径
D.从顶点i出发进行广度优先遍历
40.采用邻接表存储的图的广度优先遍历算法类似于二叉树的____算法。
A.先序遍历
B.后序遍历
C.中序遍历
D.层次遍历
41.对下图从顶点C出发进行广度优先搜索,哪个是正确的搜索序列?
A.CDABEHFG
B.CBAEHGFD
C.CBDAEFGH
D.CBDAEHFG
42.在图的广度优先遍历算法中用到一个队列,每个顶点最多进队____次。
A.不确定
B.1
C.3
D.2
三.算法题
R6-1 邻接表存储图的广度优先遍历
分数 15
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
试实现邻接表存储图的广度优先遍历。
函数接口定义:
void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );
其中
LGraph
是邻接表存储的图,定义如下:/* 邻接点的定义 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */ }; /* 顶点表头结点的定义 */ typedef struct Vnode{ PtrToAdjVNode FirstEdge; /* 边表头指针 */ } AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */ /* 图结点的定义 */ typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ AdjList G; /* 邻接表 */ }; typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
函数
BFS
应从第S
个顶点出发对邻接表存储的图Graph
进行广度优先搜索,遍历时用裁判定义的函数Visit
访问每个顶点。当访问邻接点时,要求按邻接表顺序访问。题目保证S
是图中的合法顶点。裁判测试程序样例:
#include <stdio.h> typedef enum {false, true} bool; #define MaxVertexNum 10 /* 最大顶点数设为10 */ typedef int Vertex; /* 用顶点下标表示顶点,为整型 */ /* 邻接点的定义 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */ }; /* 顶点表头结点的定义 */ typedef struct Vnode{ PtrToAdjVNode FirstEdge; /* 边表头指针 */ } AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */ /* 图结点的定义 */ typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ AdjList G; /* 邻接表 */ }; typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */ bool Visited[MaxVertexNum]; /* 顶点的访问标记 */ LGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */ void Visit( Vertex V ) { printf(" %d", V); } void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); int main() { LGraph G; Vertex S; G = CreateGraph(); scanf("%d", &S); printf("BFS from %d:", S); BFS(G, S, Visit); return 0; } /* 你的代码将被嵌在这里 */
输入样例:给定图如下
2
输出样例:
BFS from 2: 2 0 3 5 4 1 6
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
void BFS(LGraph Graph,Vertex S,void (*Visit)(Vertex) ) { PtrToAdjVNode p; PtrToAdjVNode q[MaxVertexNum]; int head=0,tail=0; Visit(S); Visited[S]=true; q[tail++]=Graph->G[S].FirstEdge; while(head!=tail) { p=q[head++]; while(p!=NULL) { if(Visited[p->AdjV]==false){ q[tail++]=Graph->G[p->AdjV].FirstEdge; Visit(p->AdjV); Visited[p->AdjV]=true; } p=p->Next; } } }
R6-2 邻接矩阵存储图的深度优先遍历
分数 15
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
试实现邻接矩阵存储图的深度优先遍历。
函数接口定义:
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
其中
MGraph
是邻接矩阵存储的图,定义如下:typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
函数
DFS
应从第V
个顶点出发递归地深度优先遍历图Graph
,遍历时用裁判定义的函数Visit
访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V
是图中的合法顶点。裁判测试程序样例:
#include <stdio.h> typedef enum {false, true} bool; #define MaxVertexNum 10 /* 最大顶点数设为10 */ #define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/ typedef int Vertex; /* 用顶点下标表示顶点,为整型 */ typedef int WeightType; /* 边的权值设为整型 */ typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */ bool Visited[MaxVertexNum]; /* 顶点的访问标记 */ MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */ void Visit( Vertex V ) { printf(" %d", V); } void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); int main() { MGraph G; Vertex V; G = CreateGraph(); scanf("%d", &V); printf("DFS from %d:", V); DFS(G, V, Visit); return 0; } /* 你的代码将被嵌在这里 */
输入样例:给定图如下
5
输出样例:
DFS from 5: 5 1 3 0 2 4 6
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
void DFS(MGraph Graph,Vertex V,void (*Visit)(VerTex))
{
Visit(V);
Visited[V]=true;
for(Vertex W=0;W<Graph->Nv;W++)
{
if(Graph->G[V][W]!=INFINITY&&!Visited[W])
{
DFS(Graph,W,Visit);
}
}
}