数据结构练习题

注:这个题大部分是自己做的,有的是上网查的,不一定对,字迹潦草见谅。
一、选择题(共20分,每题1分)
1.从逻辑上可以把数据结构分为两大类,分别是(C)。
A.动态结构、静态结构 B.顺序结构、链式结构
C.线性结构、非线性结构 D.初等结构、构造型结构
2.下面给出的四种排序法中( D )排序法是不稳定的排序法。
A. 插入 B. 冒泡 C. 二路归并 D. 堆排序
3. 线性表是具有n个(C)的有限序列(n>0)。
A.表元素 B.字符 C.数据元素 D.数据项
4.在下面的程序段中,对x的赋值语句的频度为(C)
FOR i:=1 TO n DO
FOR j:=1 TO n DO
x:=x+50;
A. O(2n) B.O(n) C.O(n2) D.O(log2n)
5. 下述哪一条是顺序存储结构的优点?(A)
A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示
6. 栈是一种(B)的线性表。
A. 先进先出 B. 后进先出 C. 后进后出 D. 不分顺序
7. 设栈的输入序列是1,2,3,4,则(A)不可能是其出栈序列。
A. 4,3,1,2, B. 2,1,3,4,
C. 1,4,3,2, D. 1,2,4,3,
8. 双向链表中有两个指针域,llink和rlink,分别指回前驱及后继,设p指向链表中的一个结点,q指向一待插入结点,现要求在p前插入q,则正确的插入为(D)
A. p^.llink:=q; q^.rlink:=p; p^.llink^.rlink:=q; q.llink:=p.llink;
B. q^.llink:=p^.llink; p^.llink^.rlink:=q; q^.rlink:=p; p.llink:=q.rlink;
C. q^.rlink:=p; p^.rlink:=q; p.llink.rlink:=q; q^.rlink:=p;
D. p.llink.rlink:=q; q^.rlink:=p; q.llink:=p.llink; p^.llink:=q;
9.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用(D)最节省时间。
A. 单链表 B.单循环链表 C. 带尾指针的单循环链表 D.带头结点的双循环链表
10. 树是结点的有限集合,一棵非空的树它有(C)根结点。
A. 有0个或1个 B. 有0个或多个 C. 有且只有一个 D. 有1个或1个以上
11.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为(D)
A.求子串 B.联接 C.求串长 D.匹配
12.已知串S=‘aaab’,其Next数组值为(A)。
A.0123 B.0012 C.1231 D.1211
13. 设给定权值总数有n 个,其哈夫曼树的结点总数为(D)
A.不确定 B.2n C.2n+1 D.2n-1
14. 设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是(A)
A.m-n B.m-n-1 C.n+1 D.条件不足,无法确定
15. 深度为h的满m叉树的第k层有(B)个结点。(1=<k=<h)
A.mk-1 B.mk-1 C.mh-1 D.mh-1
16.树的后根遍历序列等同于该树对应的二叉树的(B).
A. 先序序列 B. 中序序列 C. 后序序列 D.没有对应关系
17. 已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为(B)。
A.FEDCBA B.CBEFDA C. CBEDFA D.不确定
18.在图的理论与应用中,关键路径是事件结点网络中(A)。
A.从源点到汇点的最长路径 B.从源点到汇点的最短路径
C.最长回路 D.最短回路
19.在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的(C)倍。
A.1/2 B.2 C.1 D.4
20.下列哪一种图的邻接矩阵是对称矩阵?(B)
A.有向图 B.无向图 C.AOV网 D.AOE网
二、填空题(共30分,每空2分)

  1. 一棵具有 n个结点的完全二叉树的树高度(深度)是 [logn]+1。
  2. 数据结构分别为逻辑结构、存储结构(物理结构),逻辑结构有分为四类基本结构,分别是集合结构、线性结构、树状结构和网络结构。存储结构(物理结构)又分为顺序存储结构和链式存储结构。
    逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。
  3. 若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是11
  4. 树是结点的有限集合, 树是由根结点和若干颗子树构成的。一个节点含有的子树的个数称为该节点度;一棵树高为K的完全二叉树至少有2^k-1个结点;高度为 K的二叉树最大的结点数为2k-1。
  5. 哈夫曼树是一种带权路径长度最短的树,在一个度为m的哈夫曼树中,其叶结点个数为n,则非叶结点的个数为(n-1) / (m-1)。
    “https://blog.csdn.net/u011686226/article/details/52411306”
    三、简答题(共60分)
    1.(5分)如图1所示的二叉树,请分别写出中序和后序遍历序列。
    中序:DEBAFGC
    后序:EDBGFCA
    在这里插入图片描述
    图1 第一题图
    在这里插入图片描述
    图2第二题图

2 .(5分)对于图2所示的无向带权图,构造最小生成树。
在这里插入图片描述
3.(8分)什么是拓扑排序?简述AOV网的含义。
拓扑排序是有向图的一个重要操作。在给定的有向图G中,若顶点序列v1,v2,…,vn满足下列条件:若在有向图G中从顶点vi到顶点vj有一条路径,则在序列中顶点vi必在vj之前,便称这个序列为一个拓扑序列。求一个有向图拓扑序列的过程称为拓扑排序。
常用的拓扑排序方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它。
(2)从图中删去该顶点,并且删去从该顶点发出的所有边。
(3)重复上述步骤(1)和(2),直到当前有向图中不存在没有前驱结点的顶点为止,或者当前有向图中的所有结点均已输出为止。
AOV-网 :用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表 示活动的网(Activity On Vertex Network), 简称AOV-网。
4.(8分)有一份电文中共使用 6个字符:a,b,c,d,e,f,它们的出现频率依次为2,3,4,7,8,9,试构造一棵哈夫曼树,并计算其加权路径长度WPL。

在这里插入图片描述

5.(8分)(1).如果G1是一个具有n个顶点的连通无向图,那么G1最多有多少条边?G1最少有多少条边?(2).如果G2是一个具有n个顶点的强连通有向图,那么G2最多有多少条边?G2最少有多少条边?
(1)
最多:n(n-1)/2
最少:n条边
(2)
最多的情况:即n个顶点中两两相连,若不计方向,n个点两两相连有n(n-1)/2条边,而由于强连通图是有向图,故每条边有两个方向,n(n-1)/2×2=n(n-1),故有n个顶点的强连通图最多有n(n-1)条边。
最少的情况:即n个顶点围成一个圈,且圈上各边方向一致,即均为顺时针或者逆时针,此时有n条边。
6.(8分)关键字序列 T=(21,25,49,25*,16,08),请写出一趟快速排序的结果。该排序方法是稳定的吗?为什么?
21,25,08,16,25*,49
快排是不稳定的,因为当交换的两个数相等时,就会导致不稳定
7. (8分)简述关键路径的求解步骤。
关键路径的计算方法如下:
(1) 输入e条弧<j,k>,建立AOE网的存储结构;
(2) 从源点v1出发,令ve(1)=0,求 ve(j) ,2<=j<=n;
(3) 从汇点vn出发,令vl(n)=ve(n),求 vl(i), 1<=i<=n-1;
(4) 根据各顶点的ve和vl值,求每条弧s(活动)的最早开始时间e(s)和最晚开始时间l(s),其中e(s)=l(s)的为关键活动。
求关键路径是在拓扑排序的前提下进行的,不能进行拓扑排序,自然也不能求关键路径。
8. (10分)已知关键字集合 { 19, 01, 23, 14, 55, 68, 11, 82, 36 },设定哈希函数 H(key) = key MOD 11,请构造哈希表,利用线性探测再散列 di = cXi ,其中 c=1解决冲突,并计算平均查找长度ASL。
在这里插入图片描述
在这里插入图片描述
四、设计题(共40分)

  1. (20分)设计算法,求用顺序结构存储的串s和串t的一个最长公共子串。其中,串s用i指针(1<=i<=s.len)。t串用j指针(1<=j<=t.len)。(伪代码即可,要求表达描述清晰)
    一、首先可以想到的是,在这里找到s所有的子串,b的所有子串,之后一一去比较,保留最长的那个子串,这个复杂度是很高的,所以不建议使用。
    二、还有一种方法我想可以外层循环指向串s,内层循环指向串i,这样的话,每次找到一个s[i]比较内层循环是否有相同的字母,若是没有相同的字母,则结束,若是有相同的字母,则继续向后比较,直到遇到一个不同的字母为止,比较当前长度是否大于最大长度,若大于则修改指定长度。这样遍历完成后,便能找到最大的长度。(未用代码尝试,不一定能通过所有的测试样例)
    三、下面是看到网上的解释的一种想法
    在这里插入图片描述
    这里是两个字符串组成的矩阵,我们遍历这个矩阵,判断若是a[i]==b[j],那么a[i,j]这个地方至少为1。每个a[i,j]都和a[i-1,j-1]有关。我们可以得到如下关系
if (a[i]==a[j]&&i,j范围合法) {   //通过该关系遍历整个矩阵,其中a[i, j]最大值,即是解。
	   a[i, j] = a[i-1, j-1]+1
}else if (a[i]==a[j]) {
   a[i,j]=1
}else {
   a[i,j]=0
}

2.(20分)如图所示,村庄之间的距离如图中各边上的权值所示。现在要从这4个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院最近。试写出解决思想与方案,并给出程序主要代码(伪代码即可,要求表达描述清晰)。(有向边<Vi,Vj>表示第i个村庄和第j个村庄之间有道路,边上的权表示这条道路的长度)

在这里插入图片描述
找到网上的题解,我认为思路应该是这样,首先要求医院到最远的村庄是最近的,这里,首先就要直到每个村庄到其他村庄的最远距离是多少,要想知道这个,就要知道任意两个村庄之间的距离是多少,那么这个算法可以通过弗洛伊德得到各个村庄之间的最短距离,然后再遍历这个矩阵,找到每个村庄到其他村庄的最远距离并记录,这里记录之后,在这四个村庄的最远距离中,选择一个最近的距离,那个村庄是最适合建立医院的。
注:其实这里面最复杂的是弗洛伊德算法,剩下可以当做找最小值的游戏,首先从弗洛伊德矩阵的每行找到一个最大值,再从这个最大值中,找到一个最小值,那么最小值对应的行号即是解。
下面是网上弗洛伊德的代码,这段代码主要的思想就是填写矩阵d,这里使用两层循环控制d[i][j]中的i和j,在通过一层循环控制k,这个k就是我能不能通过其他的两条或者多条路径的距离要小于i和j的直连路径,若是有的话,那么我就更新,要是没有我就不更新。这里不断更新d[i][j],最终尝试了所有的k值,可以找到所有i和j的最短路径值。

	#include <iostream>
	#include <algorithm>
	
	using namespace std;
	#define INF (1 << 21) 
	
	static const int MAX = 500;
	
	int d[MAX][MAX];    //最小距离
	
	int V,s;
	
	void floyd(){
	    for(int k = 0; k < V; k++){
	        for(int i = 0; i < V; i++){
	            for(int j = 0; j < V; j++){
	                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
	        }
	    }
	}
	int main(){
	    cin >> V;
    int x;
	    for(int i = 0; i < V; i++){
        for(int j = 0; j < V; j++){        
            cin >> x;
	            if(x == 0){
	                d[i][j] = INF;
	            }
	            else{
                d[i][j] = x;
            }
	        }
	    }
    floyd();
	    for(int i = 0; i < V; i++){
       for(int j = 0; j < V; j++){
           if(i == j) d[i][j] = 0;
         cout << (d[i][j] == INF ? -1 : d[i][j]) << " ";
      }
        cout << endl;
	    }
	    return 0;
	}

  • 16
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值