数据结构练习题1401

注意事项:
1.该试卷中,凡使用到“图”的概念,皆不考虑顶点到其自身的弧或边,即以VR表示图中两个顶点之间关系的集合,若<vi,vj>∈VR,则vi≠vj。
2.该试卷中,凡使用“矩阵”概念处,行、列均从1开始计数。
3.该试卷中,使用到数字概念时,除指定进制外,均为10进制。

一、单项选择题(每题1分,共20分)

1.算法的时间复杂度与( )有关。
A.问题的规模
B.计算机硬件性能
C.编译程序的质量
D.程序设计语言

2.向顺序表中第i个元素之后插入一个新元素时,首先从_______开始向后的所有元素均要__________一个位置,接着把新元素写入___________上,最后,使线性表的长度________________。下面四个选项中( )全部符合要求。
A.i位置,向后移动,i位置,加1
B.i位置,向后移动,i+1位置,加1
C.i+1位置,向后移动,i+1位置,加1
D.i+1位置,向后移动,i位置,加1

3.若线性表最常用的操作是存取第i个元素及其前趋的值,则采用( )存储方式节省时间。
A.单链表
B.双链表
C.单循环链表
D.顺序表

4.栈操作的原则是( )。
A.先进先出
B.后进先出
C.只能进行插入
D.只能进行删除

5.某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是( )的二叉树。
A.空或只有一个结点
B.高度等于其结点数
C.任一结点无左孩子
D.任一结点无右孩子

6.若进栈序列为1,2,3,4,进栈过程中可以出栈,则( )不可能是一个出栈序列。
A.3,4,2,1
B.2,4,3,1
C.1,4,2,3
D.3,2,1,4

7.若用数组S[0…m]作为两个栈S1和S2的共同存储结构,对任何一个栈,只有当S全满时才不能作入栈操作。为这两个栈分配空间的最佳方案是( )。
A.S1的栈底位置为0,S2的栈底位置为m
B.S1的栈底位置为0,S2的栈底位置为m/2
C.S1的栈底位置为1,S2的栈底位置为m
D.S1的栈底位置为1,S2的栈底位置为m/2

8.循环链表L的尾结点p的特点是( )。
A.p->next==L
B.p->nextL ->next
C.p
L
D.p==L->next

9.串的长度是( )。
A.串中不同字母的个数
B.串中不同字符的个数
C.串中所含字符的个数,且大于0
D.串中所含字符的个数

10.已知广义表(( ),(a), (b, c, (d), ((d, f)))),则以下说法正确的是( )。
A.表长为3,表头为空表,表尾为((a), (b, c, (d), ((d, f))))
B.表长为3,表头为空表,表尾为(b, c, (d), ((d, f)))
C.表长为4,表头为空表,表尾为((d, f))
D.表长为3,表头为(()),表尾为((a), (b, c, (d), ((d, f))))

11.对称矩阵的压缩存储:以行序为主序存储下三角中的元素,包括对角线上的元素。二维下标为( i,j ),存储空间的一维下标为k,给出k与i, j (i<j)的关系k=( )(1<= i, j <= n , 0<= k < n*(n+1)/2)。
A.i*(i-1)/2+j-1
B.i*(i+1)/2+j
C.j*(j-1)/2+i-1
D.j*(j+1)/2+i

12.在有n个结点的二叉链表中,值为非空的链域的个数为( )。
A.n-1
B.2n-1
C.n+1
D.2n+1

13.一棵二叉树的顺序存储情况如下:

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
A  B  C  D  E  0  F  0  0  G   H    0   0   0   X

结点D的左孩子结点为( )。
A.E
B.C
C.F
D.没有

14.一棵“完全二叉树”结点数为25,高度为( )。
A.4
B.5
C.6
D.不确定

15.一个有向图,共有n条弧,则所有顶点的度的总和为( )。
A.2n
B.n
C.n-1
D.n/2

16.若表R在排序前已按键值递增顺序排列,则( )算法的比较次数最少。
A.直接插入排序
B.快速排序
C.归并排序
D.选择排序

17.下列排序算法中,( )排序在某趟结束后不一定选出一个元素放到其最终的位置上。
A.选择
B.冒泡
C.归并
D.堆

18.下列排序算法中,稳定的排序算法是:( )。
A.堆排序
B.直接插入排序
C.快速排序
D.希尔排序

19.堆排序的时间复杂度是( )。
A.O(n*n)
B.O(n*log n)
C.O(n)
D.O(log n)

20.广义表A=(a,b,c,(d,(e,f))),则Head(Tail(Tail(Tail(A))))的值为( );(Head与Tail分别是取表头和表尾的函数)
A.(d,(e,f))
B.d
C.f
D.(e,f)

二、判断题(每题1分,共10分,对的打√,错的打X)

(×) 1. 如果一个串中的所有字符均在另一串中出现,则说前者是后者的子串。
() 2. 已知指针P指向链表L中的某结点,执行语句P=P->next不会删除该链表中的结点。
(×) 3. 向顺序栈中压入元素时,是先移动栈顶指针,后存入元素。
() 4. 二叉树的先序遍历中,任意一个结点均处在其孩子结点的前面。
(×) 5. 邻接表只能用于有向图的存储,邻接矩阵对于有向图和无向图的存储都适用。
() 6. 有向无环图必有拓扑序列。
() 7. 任一AOE网中至少有一条关键路径,且是从源点到汇点的路径中最长的一条。
(×) 8. 给出不同的输入序列建造二叉排序树,一定得到不同的二叉排序树。
() 9. 当待排序序列初始有序时,直接插入排序的时间复杂性为O(n)。
(×) 10. 单链表可以实现随机存取。

三、填空题(每空1分,共10分)

1.二分查找算法描述如下:
intSearch_Bin(SST ST, KT key)
{
low=1 ;
high=ST. length;
while(low<=high)
{
mid=(low+high)/2;
if(key==ST.elem[mid].key)return mid;
else if(key<ST.elem[mid].key)
hight = mid - 1;
else low = mid + 1;
}
return 0;
}

2.在表达式“4-6/3+(7-3*2-5…”求值的过程中,处理5时刻的操作数栈的内容为 2, 1, 5 ,运算符栈的内容为 +(-

3.链式二叉树的定义如下:
typedefstructBtn{
TElemType data;
BTN *lchild, *rchild;
}BTN ,*BT;

4.在有n个叶子结点的哈夫曼树中,总结点数是 2n-1
5.对n个元素进行归并排序,需要的辅助空间为 O(n)
6.对于顺序栈或队列,插入或删除元素的时间复杂性为 O(1)
7.在一个具有n个顶点的有向完全图中包含有 n(n-1) 条边。
8.有稀疏矩阵如下:

它的三元组存储形式为: (1, 3, 5), (2, 1, 7), (3, 1, -3), (4, 2, 4), (5, 2, 2)

四、综合题(每小题8分,6小题,共48分)

1.二叉树如图所示,请标明树中每个结点的平衡因子,说明该树是否平衡?再依次插入(90,30,45),同时进行平衡化处理,并计算平均查找长度ASL。
(1)在原图上标出每个结构的平衡因子(2分);
(2)该树是否平衡(1分):
(3)在下面平衡二叉树中依次插入(90,30,45),画出每插入一个元素时进行平衡化处理的结果(4分):

image.png

(4)求其ASL(1分):
ASL=(1*1+2*2+3*4+4*4)/11=3

image.png

2、设哈希表长为m=13,散列函数为H(k)=k mod 11,关键字序列为5,7,16,12,11,21,31,51,17,81;试求:散列后的表中关键字分布(假定解决冲突的方法为线性探测再散列法);求平均查找长度ASL;计算该表的装填因子。

(1)按要求求哈希表(5分):

0123456789101112
111281516751312117

(2)计算ASL(2分):ASL=(1*7+2*2+6*1)/10=1.7

(3)计算装填因子(1分):装填因子=10/13

3.现有以下按前序和中序遍历二叉树的结果:
前序:ABCEDFGHI 中序:CEBGFHDAI
画出该二叉树的逻辑结构图(6分),并在图中加入中序线索(2分)。

image.png

4.有电文:ABCDBCDCBDDBACBCCFCDBBBEBB。
用Huffman树构造电文中每一字符的最优通讯编码。画出构造的哈夫曼树,并给出每个字符的哈夫曼编码方案。
(1)构造哈夫曼树(5 分):
A:2 B:10 C:7 D:5 E:1 F:1
image.png

(2)哈夫曼编码方案(3 分):
A:0001 B:1 C:7

5.有一组待排序的关键字如下:(54,38,96,23,15,72,60,45,83)
分别写出希尔排序、快速排序、堆排序、归并排序第一趟排序后的结果。
(1)希尔排序(2分):d=5时,(54, 38, 45, 23, 15, 72, 60, 96, 83)
d=4时,(15, 38, 60, 23, 54, 72, 96, 45, 83)
(2)快速排序(2分):(45, 38, 15, 23, 54, 72, 60, 96, 83)
(3)堆排序(2分):(96, 83, 72, 45, 15, 54, 60, 38, 23)
(4)归并排序(2分):(38, 54, 23, 96, 15, 72, 45, 60, 83)

6.无向网如下:

6题题目

6题答案

五、算法题(12分)
已知带头结点的单循环链表L,编写算法实现删除其中所有值为e 的数据元素结点。
(要求:类型定义(2分)、算法描述(8分)和算法分析(2分))

typedef struct LNode {
	ElemType data;
	struct LNode *next;
} Lnode, *LinkList;

void ListDelete_e(LinkList L, Element e) {
	LinkList p, q;
	if (L->next==L)
		return;
	p = L;
	while (p->next != L)
	{
		if (p->next->data != e)
			p = p->next;
		else
		{
			q = p->next;
			p->next = q->next;
			free(q);
		}
	}
}

时间复杂度为 O(n)

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 一棵二叉树的顺序存储情况如下: 树中,度为2的结点数为( )。 A.1 B.2 C.3 D.4 2. 一棵“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 3.下列说法中,( )是正确的。 A. 二叉树就是度为2的树 B. 二叉树中不存在度大于2的结点 C. 二叉树是有序树 D. 二叉树中每个结点的度均为2 4.一棵二叉树的前序遍历序列为ABCDEFG,它的中序遍历序列可能是( )。 A. CABDEFG B. BCDAEFG C. DACEFBG D. ADBCFEG 5.线索二叉树中的线索指的是( )。 A.左孩子 B.遍历 C.指针 D.标志 6. 建立线索二叉树的目的是( )。 A. 方便查找某结点的前驱或后继 B. 方便二叉树的插入与删除 C. 方便查找某结点的双亲 D. 使二叉树的遍历结果唯一 7. 有abc三个结点的右单枝二叉树的顺序存储结构应该用( )示意。 A. a b c B. a b ^ c C. a b ^ ^ c D. a ^ b ^ ^ ^ c 8. 一颗有2046个结点的完全二叉树的第10层上共有( )个结点。 A. 511 B. 512 C. 1023 D. 1024 9. 一棵完全二叉树一定是一棵( )。 A. 平衡二叉树 B. 二叉排序树 C. 堆 D. 哈夫曼树 10.某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是( )的二叉树。 A.空或只有一个结点 B.高度等于其结点数 C.任一结点无左孩子 D.任一结点无右孩子 11.一棵二叉树的顺序存储情况如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A B C D E 0 F 0 0 G H 0 0 0 X 结点D的左孩子结点为( )。 A.E B.C C.F D.没有 12.一棵“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 二、填空题(每空3分,共18分)。 1. 树的路径长度:是从树根到每个结点的路径长度之和。对结点数相同的树来说,路径长度最短的是 完全 二叉树。 2. 在有n个叶子结点的哈夫曼树中,总结点数是 2n-1 。 3. 在有n个结点的二叉链表中,值为非空的链域的个数为 n-1 。 4. 某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是 任一结点无左孩子 的二叉树。 5. 深度为 k 的二叉树最多有 个结点,最少有 k 个结点。 三、综合题(共58分)。 1. 假定字符集{a,b,c,d,e,f }中的字符在电码中出现的次数如下: 字符 a b c d e f 频度 9 12 20 23 15 5 构造一棵哈夫曼树(6分),给出每个字符的哈夫曼编码(4分),并计算哈夫曼树的加权路径长度WPL(2分)。 (符合WPL最小的均为哈夫曼树,答案不唯一) 哈夫曼编码: 2. 假用于通信的电文由字符集{a,b,c,d,e,f,g}中的字符构成,它们在电文中出现的频率分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。要求: (1)为这7个字符计哈夫曼树(6分)。 (2)据此哈夫曼树计哈夫曼编码(4分)。 (3)假电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少?(4分) (1) 为这7个字符计哈夫曼树为(符合WPL最小的均为哈夫曼树,答案不唯一): (2) 哈夫曼编码为: a:01;b:001;c:100;d:0001;e:101;f:11;g:0000 (3) 假电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少? 采用等长码,100个字符需要300位二进制数,采用哈夫曼编码发送这100个字符需要261二进制位,压缩了300-261=39个字符。压缩比为39/300=13%。 3. 二叉数T的(双亲到孩子的)边集为: { <A,B>, <A,C>, <D,A>, <D,E>, <E,F>, <F,G> } 请回答下列问题: (1)T的根结点(2分): (2)T的叶结点(2分): (3)T的深度(2分): (4)如果上述列出边集中,某个结点只有一个孩子时,均为其左孩子;某个结点有两个孩子时,则先列出了连接左孩子的边后列出了连接右孩子的边。画出该二叉树其及前序线索(6分)。 (1)T的根结点 (2)T的叶结点 : (3)T的深度 : (4)该二叉树其及前序线索为: 4.现有以下按前序和中序遍历二叉树的结果: 前序:ABCEDFGHI 中序:CEBGFHDAI 画出该二叉树的逻辑结构图(5分),并在图中加入中序线索(5分)。 5.有电文:ABCDBCDCBDDBACBCCFCDBBBEBB。 用Huffman树构造电文中每一字符的最优通讯编码。画出构造的哈夫曼树,并给出每个字符的哈夫曼编码方案。(符合WPL最小的均为哈夫曼树,答案不唯一) (1)构造哈夫曼树(6分): (2)哈夫曼编码方案(4分):
哈夫曼树(Huffman Tree)是一种特殊的二叉树,用于数据压缩和编码。它的构建过程是根据字符出现的频率来确定每个字符的编码,使得出现频率高的字符具有较短的编码,而出现频率低的字符具有较长的编码。 以下是一个Python实现的哈夫曼树的例子: ```python class TreeNode: def __init__(self, value, freq): self.value = value self.freq = freq self.left = None self.right = None def build_huffman_tree(char_freq): nodes = [TreeNode(char, freq) for char, freq in char_freq.items()] while len(nodes) > 1: nodes = sorted(nodes, key=lambda x: x.freq) left_node = nodes.pop(0) right_node = nodes.pop(0) parent_node = TreeNode(None, left_node.freq + right_node.freq) parent_node.left = left_node parent_node.right = right_node nodes.append(parent_node) return nodes[0] def encode_huffman_tree(root, code='', codes={}): if root is None: return if root.value is not None: codes[root.value] = code encode_huffman_tree(root.left, code + '0', codes) encode_huffman_tree(root.right, code + '1', codes) return codes def decode_huffman_tree(root, encoded_text): decoded_text = '' current_node = root for bit in encoded_text: if bit == '0': current_node = current_node.left else: current_node = current_node.right if current_node.value is not None: decoded_text += current_node.value current_node = root return decoded_text # 示例用法 char_freq = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45} huffman_tree = build_huffman_tree(char_freq) huffman_codes = encode_huffman_tree(huffman_tree) encoded_text = ''.join([huffman_codes[char] for char in 'abcdef']) decoded_text = decode_huffman_tree(huffman_tree, encoded_text) print("Huffman Codes:", huffman_codes) print("Encoded Text:", encoded_text) print("Decoded Text:", decoded_text) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风醉雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值