考研数据结构大题整合
目录
- 考研数据结构大题整合
- 三、LZH组
- LZH 组一
- LZH 组二
- LZH 组三
- LZH 组四
- LZH 组五
- LZH 组七
三、LZH组
LZH 组一
给出如图所示的无向图G的邻接矩阵和邻接表两种存储结构.
(2)解答下面的问题(6分)
(1) 求网的最小生成树有哪些算法?各适用何种情况?为什么?
(2) 由以下的网络邻接矩阵,画出一棵最小生成树
(3)已知一棵非空二叉树,其按中根和后根遍历的结果分别为:
中根:CGBAHEDJFI 后根:GBCHEJIFDA
试将这样的二叉树构造出来。若已知先根和后根的遍历结果,能否构造出这棵二叉树,为什么? 5分
(4)一项工程由P1、P2、…P6六项子工程组成, 这些工程之间有下列关系: P1<P2,P3<P6,P4<P3,P2<P6,P4<P5,P1<P3,P5<P6,符号“<”表示“先于”关系,例如P2<P6表示P2完成后P6才能开始。请给出工程P的三种可能的施工顺序。 (6分)
(5)假定用于通信的电文由8个字母A,B,C,D,E,F,G,H组成,各字母在电文中出现的概率为5%,25%,4%,7%,9%,12%,30%,8%,试为这8个字母设计哈夫曼编码。(7分)
五、 (1) 读程序,分析其时间复杂度: 4分
m = 91;
n = 100;
while (n > 0)
if (m > 0)
{
m = m - 10;
n = n - 1;
}
else
m = m + 1;
此程序的时间复杂度是____________ 。
(2)以下程序为求二叉树深度的递归算法,请填空完善之 6分
typedef struct node
{
char data;
struct node lchild, rchild;
} *bitree;
int depth(bitree bt) /* bt为根结点的指针*/
{
int hl, hr;
if (br == NULL)
return (____________);
hl = depth(bt->lchild);
hr = depth(bt->rchild);
if (____________)
____________________
return(hr + 1);
}
(3)已知N元整型数组a 存放N个学生的成绩,已按由大到小排序,以下算法是用折半查找方法统计成绩大于或等于x分的学生人数,请填空完善之。6分
#define N /*学生人数*/
int uprx(int a[N], int x) /*函数返回大于或等于x分的学生人数 */
{
int head, mid, rear;
do
{
mid = (head + rear) / 2;
if (x <= a[mid])
____________________
else________________;
} while (____________);
if (a[head] < x)
return head - 1;
return head;
}
(4)简述以下算法的功能:4分
void BB(LNode *s, LNode *q)
{
p = s;
while (p->next != q)
p = p->next;
p->next = s;
}
void AA(LNode *pa, LNode *pb)
{ // pa和pb分别指向单循环链表中的两个结点
BB(pa, pb);
BB(pb, pa);
}
LZH 组二
(2) 用普里姆算法构造出如图所示的图G的一棵最小生成树. 6分
(3)已知序列{17,18,60,40,7,32,73,65,85},请给出采用起泡排序法对该序列作升序排序时的每一趟的结果。 (6分)
(4)输入下列整数序列,画出建立的二叉排序树,最后分别图示将其中的50,86删除后的二叉排序树(7分)。
(86,50,78,59,90,64,55,23,100,40,80,45)
(5)一棵完全二叉树共有21个结点,现顺序存放在一个向量中,向量的下标正好为结点的序号,请问有序号为12的双亲结点存在吗?为什么?5分
五、 (1) 读程序,分析时间复杂度 4分
for (i = 0; i < m; i++)
for (j = 0; j < t; j++)
c[i][j] = 0;
for (i = 0; i < m; i++)
for (j = 0; j < t; j++)
for (k = 0; k < n; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
此程序的时间复杂度是_________ 。
(2)以下程序的功能是实现带附加头结点的单链表数据结点逆序连接,请填空完善之 6分
void reverse(pointer h)
{
pointer p, q;
p = h->next;
h->next = NULL;
while (__________)
{
q = p;
p = p->next;
q->next = h->next;
h->next = _______________________;
}
}
(3)二叉排序树的结点类型如下:6分
typedef struct node
{
datatype data;
struct node *lchild, *rchild;
} bitreptr;
请在下面算法划线处填上适当内容,以完成在二叉排序树中查找键值为k的结点。
bitreptr *
search(t, k) /*在二叉排序树上查找键值k的结点 */
/*成功时返回指向该结点的指针,否则返回空指针*/
{
bitreptr *t;
datatype k;
if (t = = NULL)
returen NULL;
else if (t->data = = k)
return t;
else if (t->data > k)
________;
else if (t->data < k)
_____________;
} /*search*/
(4)阅读下述程序,指出其输出结果:4分
void g(int **);
main()
{
int line[100], i;
int *p = line;
for (i = 0; i < 100; i++)
{
*p = i;
g(&p);
}
for (i = 0; i < 100; i++)
cout << line[i];
}
void g(int **p)
{
(**p)++;
(*p)++;
}
LZH 组三
四、画图/计算/证明 (30分)
1. 证明题(5分)
试证明有n0个叶子的哈夫曼树共有2n0-1个结点。
2.一项工程由P1、P2、…P6六项子工程组成, 这些工程之间有下列关系: P1<P2,P3<P6,P4<P3,P2<P6,P4<P5,P1<P3,P5<P6,符号“<”表示“先于”关系,例如P2<P6表示P2完成后P6才能开始。请给出工程P的三种可能的施工顺序。(5分)
- 已知一棵二叉树的中序遍历序列为:BAFDJGCKHLEIM,后序遍历序列为BFJGDKLHMIECA.请完成(6分)
1. 构造出这颗二叉树;
2. 画出这颗二叉树中序线索化后的结构
- 对长度为8的有序表,给出折半查找的判定树,给出等概率情况下的平均查找长度。(5分)
- (9分) 已知一个图G=(V,E),其中V={a,b,c,d,e,f};
E={<a,b>,<a,d>,<a,e>,<d,e>,<e,b>,<c,b>,<c,e>,<c,f>,<f,e>}
(1) 请画出该图,并写出邻接矩阵
(2) 根据邻接矩阵,分别给出从顶点a出发的深度优先和广度优先遍历序列
(3) 画出由此得到的深度优先和广度优先生成树(或森林)
五. 程序填空题 (20分,每个函数5分)
- 用链表表示数据的简单选择排序,结点的域为数据域data,指针域next,链表首指针为head,链表无头结点。
selectsort(head)
{
p = head;
while (p ___________)
{
q = p;
r = ___________;
while (___________)
{
if (q->next->data > r->data)
q = r;
r = ___________;
}
tmp = q->data;
q->data = p->data;
p->data = tmp;
p = ___________;
}
}
- n个顶点的有向图用邻接矩阵array表示,下面是其拓扑排序算法,试补充完整。注:
(1) 图的顶点号从0开始计;
(2) indegree是有n个分量的一维数组,放顶点的入度;
(3) 函数crein用于计算顶点的入度;
(4) 有三个函数push(data)、pop()、check(),它们的含义为数据data进栈、退栈和测试栈是否为空(不空返回1,否则返回0)。
#include <iostream.h>
crein(array, indegree, n)
{
for (i = 0; i < n; i++)
indegree[i] = _______;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
indegree[i] += array[_______][_______];
}
topsort(array, indegree, n)
{
count = _______;
for (i = 0; i < n; i++)
if (_______)
push(i);
while (check())
{
vex = pop();
cout << vex;
count++;
for (i = 0; i < n; i++)
{
k = array _______;
if (_______)
{
indegree[i]--;
if (_______)
push(i);
}
}
}
}
3.设顺序表la的数据结构定义如下:
typedef struct
{
Datatype list[Maxnum];
int num;
} SeqList;
试将下面删除顺序表la中所有值为x的数据元素的算法补充完整。
void DeleteSeqList(SeqList *la, Datatype x)
{
int j, k;
for (j = 1; j <= la->num; j++)
{
if ()
{
for (k = j; k < la->num; k++)
;
la->num--;
j--;
}
}
}
LZH 组四
四、 画图/计算/证明/应用题 (30分)
(1) (6分)
试说明是否存在这样的二叉树,可以实现后序线索树进行后序遍历时不使用栈?对前序线索二叉树进行前序遍历时,什么样的二叉树可不使用栈?
(2)解答下面的问题(6分)
(1) 求网的最小生成树有哪些算法?各适用何种情况?为什么?
(2) 由以下的网络邻接矩阵,画出一棵最小生成树
(3)已知一棵非空二叉树,其按中根和后根遍历的结果分别为:
中根:CGBAHEDJFI 后根:GBCHEJIFDA
试将这样的二叉树构造出来。若已知先根和后根的遍历结果,能否构造出这棵二叉树,为什么? 5分
(4)对于如图所示的事件结点网络,求出各活动可能的最早开始时间和允许的最晚完成时间,并问哪些活动是关键活动? (6分)
(5)已知某字符串S共有8种字符,各种字符分别出现2次、1次、4次、5次、7次、3次、4次和9次,对该字符串用{0,1}进行前缀编码,问该字符串的编码至少有多少位?(7分)
五、 程序填空题 (20分)
(1) 读程序,分析其时间复杂度: 4分
m = 91;
n = 100;
while (n > 0)
if (m > 0)
{
m = m - 10;
n = n - 1;
}
else
m = m + 1;
此程序的时间复杂度是 _________ 。
(2)以下程序为求二叉树深度的递归算法,请填空完善之 6分
typedef struct node
{
char data;
struct node lchild, rchild;
} *bitree;
int depth(bitree bt) /* bt为根结点的指针*/
{
int hl, hr;
if (br == NULL)
return (_________);
hl = depth(bt->lchild);
hr = depth(bt->rchild);
if (_________)
return (hr + 1);
}
LZH 组五
四、画图/计算/证明 (30分)
1. 如果二叉树有n个结点,试问:当执行中序遍历的递归程序时,在最坏情况下为处理递归调用所设的单元至少要有多少个才行?(5分)
2.n个结点的m叉树转化为二叉树所需存储资源比未转化前用定长结点存储节省多少?(设链域占两个单元,数据域占一个单元)(5分)
- 已知一棵二叉树的中序遍历序列为:BAFDJGCKHLEIM,后序遍历序列为BFJGDKLHMIECA.请完成(6分)
1. 构造出这颗二叉树;
2. 画出这颗二叉树中序线索化后的结构
- 对长度为8的有序表,给出折半查找的判定树,给出等概率情况下的平均查找长度。(5分)
- (9分)假定有下列n*n矩阵(n为奇数)
1)A中非零元素的行下标与列下标的关系;
2)给出A中非零元素aij的下标(i,j)与B中的下标R的关系;
3)假定矩阵中每个元素占一个存储单元,且B的起始地址为A0,给出利用aij的下标(i,j)定位在B中的位置公式。
LZH 组七
四、画图/计算/证明 (30分)
1. 试说明一棵二叉树进行前序、中序、后序遍历,其叶结点的相对次序是否会发生改变?为什么?(5分)
2.n个结点的m叉树转化为二叉树所需存储资源比未转化前用定长结点存储节省多少?(设链域占两个单元,数据域占一个单元)(5分)
- 已知一棵二叉树的中序遍历序列为:BAFDJGCKHLEIM,后序遍历序列为BFJGDKLHMIECA.请完成(6分)
1. 构造出这颗二叉树;
2. 画出这颗二叉树中序线索化后的结构
- 对长度为8的有序表,给出折半查找的判定树,给出等概率情况下的平均查找长度。(5分)
// ToDo
## 四、LB组
### LB组一
### LB组二
### LB组三
### LB组四
### LB组五
### LB组六
### LB组七
### LB组八