数据结构10年考研试题及答案(整理)
- 格式:doc
- 大小:40.00 KB
- 文档页数:7
数据结构考试重点及部分答案
自己做的答案 不是很正确 如果有问题请联系 后面的大题不知道原题,所以不知道怎么做 见谅!!!
题型和分值
选择题:15*2=30
填空题:10*2=20
解答题:5*4=20
算法阅读题:5*4=20
算法设计题:10
1 栈的进栈、出栈函数顺序,求一个表达式的顺序
eg:进栈顺序是123 计算 POP(S)+2 POP(S) =3+2*2=7
2 给定二叉排序树的数据 求平均查找长度
Eg:已知长度为9的表{16 ,3 ,7 ,11 ,9 ,26,18,14,15},建立二叉顺序树后进行查找,则等概率的情况下查找成功的平均查找长度为( )
二叉排序树(Binary Sort Tree)又称二叉查找树。
它或者是一棵空树;或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树; 根据上述性质,按照给出的表,建立的树如下图:(旁边的数表示查找长度)
平均查找长度为:(1+2+2+3+3+4+5+5+6)/9 = 31/9
3 树的概念
树是n(n>=0)个结点的有限集
4 二重循环的平均时间复杂度的求解(使用嵌套、统计次数)
时间复杂度:该算法的运行时间与问题规模的对应关系,时间复杂度用T(n)=O(f(n))来表示
Eg:S=0
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
s=s+1
答案为0(n*m)
求解算法复杂度时:
1、首先确定核心操作。
很显然此算法中,核心的操作是s=s+1;
2.这个算法中,存在两重循环。第一重循环n次,第二重循环m次,总共执行核心操作n*m次。
3.确定此算法的时间复杂度为:O (n*m)
若复杂度为 O (n*n),则算法可以是如下的样子:
S=0
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
s=s+1
5 单链表中 R是P的前驱,在P Q之间插入S,则则如何插入(语句表示)
在相邻元素R、P之间插入一个值为X的数据元素的基本操作步骤:
(1)生成一个数据域值为X的结点S
(2)使X结点的指针域指向结点P:S->next=P->next
(3)修改R结点的指针域指向结点X:P->next=S
6 已知顺序表,求查找X的平均查找长度
(n+1)/2
7 栈的插入和删除的位置
栈顶
8 已知入队序列 求出队序列
原则:先进先出
9 在图中,所有度数和等于边的几倍
两倍
10 邻接矩阵中行和列分别表示什么意思
无向图邻接矩阵的第i行(或第i列)非零元素的个数正好是第i个顶点的度。
有向图邻接矩阵中第i行非零元素的个数为第i个顶点的出度,第i列非零元素的个数为第i个顶点的入度,第i个顶点的度为第i行与第i列非零元素个数之和。
11 串的基本概念
串(字符串)是由零个或多个字符组成的有限序列,只有当两个串的长度相等,并且各个对应位置的字符都相等时才相等
12 将一棵100个结点的完全二叉树,从根结点编号,则非叶子结点的最大编号是多少?
50
13.直接插入排序中循环的次数 课本第266页 正序:n-1 逆序:(n+2)(n-1)/2 随即:n^2/4
14 数据结构的二元组中R表示什么
R表示数据结构中数据元素上关系的有限集
15. 关键路径是什么
关键路径:网络终端元素的元素的序列,该序列具有最长的总工期并决定了整个项目的最短完成时间。
16 串的三种存储表示方式
定长顺序存储表示 堆分配存储表示 串的块链存储表示
17 已知一个广义表,求其中的一个元素
EG:广义表L=(a,(b,(c,(d)),e),f)
通过表头和表尾求出单元素c
(1)L1=Tail(L)=((b,(c,(d)),e)f)
(2) L2=Head(L1)=(b,(c,(d)),e)
(3)L3=Tail(L2)=((c(d)),e)
(4)L4=Head(L3)=(c,(d))
(5)L5=Head(L4)=c
总的操作:Head(Head(Tail(Head(Tail(L)))))
18 一个满二叉树的深度为K,则有多少个也叶子结点?
2^(k-1)
19 N个顶点有向完全图包含的边数
n(n-1)
20 单链表和循环链表的判空条件分别是什么
Head->next=head
21 N个元素的一维数组,求循环队列 (不会做) 22 数据结构按逻辑分为什么
线性结构和非线性结构
23 非线性结构中最重要的是什么
树型结构
24 一个只有度数为3和度数为0的树,求叶子结点
2k+1
25 顺序查找成功时所用的比较次数是多少
如果每次都成功,则比较次数是n/2
否则比较次数是(n+1)/2
26 已知无向图,顶点集是V,边集是E,求遍历方式
1、深度优先搜索
注意:每个结点只能被访问一次,又因为一个结点可以和其它的任何结点相邻接,
为了避免对一个结点的重复访问,必须对访问过的结点加以标记。
结点的邻接结点的次序是任意的,因此深度优先搜索的序列可能有多种。
深度优先搜索类似于树的前序周游。
访问方式:1、选中第一个被访问的结点。
2、对结点作已访问过的标志。
3、依次从结点的未被访问过的第一个、第二个、第三个…… 邻接结
点出发,进行深度优先搜索。转向2。
4、如果还有顶点未被访问,则选中一个起始结点,转向2。
5、所有的结点都被访问到,则结束。
Boolean visited[MAX] ; //用于标识结点是否已被访问过
Status ( * VisitFunc) (int v); //函数变量
void DFSTraverse( Graph G, Status ( * VisitFunc) (int v));
{ VisitFunc = Visit;
for ( v=0; v
for ( v=0; v
if ( ! Visited[ v ] ) DFS(G, v )
}
void DFS( Graph G, int v );
{ Visited[v] = true; VisitFunc(v);
for ( w = FirstAdjVex(G, v) ; w ; w = NextAdjVex(G, v, w) )
if ( ! Visited[ w ] ) DFS(G, w )
}
2、广度(宽度)优先搜索
注意:每个结点只能被访问一次,又因为一个结点可以和其它的任何结点相邻接, 为了避免对一个结点的重复访问,必须对访问过的结点加以标记。
结点的邻接结点的次序是任意的,因此广度优先搜索的序列可能有多种。
广度优先搜索类似于树的从根出发的按层次遍历。
访问方式:1、选中第一个被访问的结点 V
2、对结点 V 作已访问过的标志。
3、依次从结点 V 的未被访问过的第一个、第二个、第三个……第 M个
邻接结点 W1 、W2、W3…… Wm ,且进行标记。
4、依次访问结点 W1 、W2、W3…… Wm的邻接结点,且进行标记。
5、如果还有结点未被访问,则选中一个起始结点,也标记为V,转向2。
6、所有的结点都被访问到,则结束。
void BFSTraverse( Graph G, Status ( * VisitFunc) (int v));
{ VisitFunc = Visit;
for ( v=0; v
InitQueue(Q);
for ( v=0; v
if ( ! Visited[ v ] )
{ Visited[ v ] = TRUE; Visit(v); EnQueue(Q,v);
while (!EmptyQueue(Q))
{ DeQueue(Q,u);
for ( w = FirstAdjVex(G, u) ; w ; w = NextAdjVex(G, u, w) )
if ( ! Visited[ w ] )
{ Visited[ v ] = TRUE; Visit(v); EnQueue(Q, w) } ;
}
}
27 已知一个森林,画出二叉树并写出中序序列
森林与二叉树的转换见课本137页
二叉树的中序序列操作见课本128页
28 给出有向图的边集和顶点集,画出有向图,根据有向图写出拓扑排序序列
解决方案见课本182页
29 用线性探测法构造哈希图并处理冲突,写出查找成功时的平均查找长度 哈希表见课本251页
构造哈希图的方法是除留余数法 课本255页
处理冲突的方法是线性探测法 课本257页
查找长度 课本260和261页
30 判断字符串是否对称字符串 用函数填写
31 对顺序表R按递增直接插入排序
32 对整型数组进行折半查找
33 已知递归参数,则调用递归函数的返回值
34 已知单链表的头指针 head
(1)使用遍历方法输出接点的个数
(2)在链表中查找分数最低的结点并删除该结点