数据结构C++模拟卷子3Word格式.docx
《数据结构C++模拟卷子3Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构C++模拟卷子3Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构C++模拟卷子3Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/f4dfa7b4-6c07-4358-8646-f14fec780edf/f4dfa7b4-6c07-4358-8646-f14fec780edf1.gif)
template<
classElemType>
structLinkNode
{
ElemTypedata;
LinkNode<
ElemType>
*next;
};
设p指向单链表中的一个结点,s指向待插入的结点,则下述程序段的功能是( )
s->
next=p->
next;
p->
next=s;
结点*p与结点*s的数据域互换
在p所指结点之前插入s
在p所指结点之后插入s
在s所指结点之后插入p
第1.6题.(客观单选题1分)若进栈序列为1,2,3,4,5,6,且进栈和出栈操作可以穿插进行,则不可能出现的出栈序列是()
2,4,3,1,5,6
3,2,4,1,6,5
4,3,2,1,5,6
2,3,5,1,6,4
第1.7题.(客观单选题1分)用长度为m的数组作为循环队列Q的存储空间,m_front指向队头元素,m_rear指向队尾元素的下一个位置,则判定Q为空队列的条件是()
(m_rear-m_front)%m==1
m_front==m_rear
(m_rear-m_front)%m==m-1
m_front==(m_rear+1)%m
第1.8题.(客观单选题1分)在下列各棵二叉树中,( )是二叉排序树。
选D
第1.9题.(客观单选题1分)
在二叉树中,指针m_root指向根结点,p指向二叉树中某结点,则下列表达式的作用是:
判断空二叉树:
p==m_root
判断非树叶结点
p->
lchild!
=NULL||p->
rchild!
=NULL
判断树叶p->
lchild==NULL||p->
rchild==NULL
判断结点度为2p->
=NULL
第1.10题.(客观单选题1分)下列陈述中正确的是()
队列是操作被限制在两端的线性结构
二叉树是最多只有两个分支的树
层次遍历二叉树要使用栈
二叉树中序遍历能够得到有序的序列
第2题.(复合题共计50分)简答题
第2.1题.(主观题5分)设n为正整数,分析下面程序段中加下划线的语句的程序步数
利用大“O”记号给出其复杂度。
x=0;
for(i=1;
i
for(j=1;
j<
=n-i;
j++)
x++;
参考答案
总执行步数:
(n-1)+(n-2)+…+2+1=n(n-1)/2,
利用大“O”记号给出其复杂度:
T(n)=O(n(n-1)/2)=O(n2/2)=O(n2)
第2.2题.(主观题5分)为了提高检索效率,可使用二分法对一个线性结构的元素进行检索。
对给定的数据{15,17,18,22,35,51,60,88,93},用二分法查找18,写出查找过程;
并求出其成功的平均查找长度ASL。
①low=0,high=9,mid=(low+high)/2=(0+9)/2=4
18<
span="
"
>
因此high=mid=4;
②mid=(low+high)/2=(0+4)/2=2
18==data[mid]=18,因此查找成功。
查找判定树:
成功的平均查找长度ASL=(1*1+2*2+3*4+4*2)/9=25/9。
第2.3题.(主观题5分)已知某二叉数的中序遍历序列为bghicdefa,后序遍历序列为ihgdcfeba,请给出该二叉树的形态,并给出前序遍历该二叉树的序列。
该二叉树的形态为图示:
前序遍历该二叉树的序列为:
abecghidf
第2.4题.(主观题5分)已知一个无向图的顶点集为{a,b,c,d,e},其邻接矩阵如下所示
01001
10010
00011
01101
10110
(1)画出该图;
(2)从顶点a出发对该图进行深度优先遍历和宽度优先遍历,写出相应的遍历序列。
(1)图结构:
(2)
从顶点a出发进行深度优先遍历,相应的遍历序列为:
abdce
从顶点a出发进行宽度优先遍历,相应的遍历序列为:
abedc
第2.5题.(主观题5分)对于课本图5.52,写出从V3出发的深度与宽度优先遍历序列。
深度优先:
v3v2v1v6v5v4
宽度优先:
v3v2v5v1v6v4
第2.6题.(主观题5分)把序列{24,15,38,27,76,130,121}依次插入到二叉排序树,请画出最后的图,并求出等概率情况下查找成功的平均查找长度。
图:
略
20/7
第2.7题.(主观题5分)把序列{12,5,9,20,6,31,24}用二路归并算法进行排序,请问要进行多少趟排序?
每趟排序结果是什么?
3趟
5,12,9,20,6,31,24
5,9,12,20,6,24,31
5,6,9,12,20,24,31
第2.8题.(主观题5分)请写出对序列{54,38,96,23,15,72,60,45,83}用直接插入排序算法进行排序过程的每趟结果。
略。
第2.9题.(主观题5分)请写出对序列{54,38,96,23,15,72,60,45,83}用直接选择法排序算法进行排序的每趟过程。
第2.10题.(主观题5分)
把序列{63,55,90,58,70,42,10,45,83,67}依次插入到二叉排序树中,画出最后的二叉排序树。
删除结点55后,二叉排序树的形态有何变化?
再把55插入,二叉排序树的形态又是怎样的?
请画图表示。
第3题.(复合题共计30分)算法设计题
第3.1题.(主观题5分)
二叉树定义如课本。
请写出二叉树前序、中序、后序遍历的递归算法。
参考函数原型:
void_PreorderTraverse(BTNode<
*,void(*visit)(constElemType&
e));
void_InorderTraverse(BTNode<
void_PostorderTraverse(BTNode<
//先序递归遍历二叉树
voidBinaryTree<
:
:
_PreorderTraverse(BTNode<
*T,void(*visit)(constElemType&
e))
{
if(T){
visit(T->
data);
_PreorderTraverse(T->
lchild,visit);
rchild,visit);
}
}
//中序递归遍历二叉树
_InorderTraverse(BTNode<
if(T){
_InorderTraverse(T->
//后序递归遍历二叉树
_PostorderTraverse(BTNode<
_PostorderTraverse(T->
visit(T->
}
第3.2题.(主观题5分)
请写出基于后序遍历思路的算法,求出二叉树的深度。
int_Depth(BTNode<
*);
//求二叉树的深度
intBinaryTree<
_Depth(BTNode<
*T)
if(!
T)
return0;
inth1,h2;
h1=_Depth(T->
lchild);
h2=_Depth(T->
rchild);
returnh1>
h2?
h1+1:
h2+1;
第3.3题.(主观题5分)
带头结点的单链表定义如课本。
请运用单链表的基本操作函数,实现对一个单链表La的数据逆置操作。
classT>
voidreverse(LinkList<
T>
&
La);
第3.4题.(主观题5分)
现需要取得第i个结点的值并存入变量e中,如果第i个结点不存在,返回flase,否则返回true。
请写出算法。
参考原型:
boolGetElem(ElemType&
int)const;
//返回单链表中序号为i的数据元素(i的合法值为1≤i≤len)
template<
boolLinkList<
GetElem(ElemType&
e,inti)const
if(i<
1||i>
len)
returnfalse;
*p=head->
next;
intk=1;
while(k<
i){
p=p->
k++;
}
e=p->
data;
returntrue;
}//时间复杂度为O(n)
第3.5题.(主观题5分)
以下是二叉树的前序递归遍历算法。
请参考该算法,写出复制二叉树的算法。
前序递归遍历算法:
复制子树T的函数原型:
BTNode<
*BinaryTree<
_Copy(BTNode<
//复制一棵子树
if(T==NULL)
returnNULL;
BTNode<
*p;
p=newBTNode<
;
p->
data=T->
lchild=_Copy(T->
rchild=_Copy(T->
returnp;
第3.6题.(主观题5分)
后序递归遍历算法如下。
请写出基于后遍历思路的删除子树T的算法。
删除子树T的算法的函数原型:
_Destroy(BTNode<
*&
T);
//销毁二叉链表形式的二叉树T
_Destroy(T->
deleteT;
T=NULL;