模拟试题1
一、选择题(20分)
1. 组成数据的基本单位是( )。
(A) 数据项(B)数据类型(C)数据元素(D)数据变量
2. 线性表的链接实现有利于( )运算。
(A) 插入(B)读表元(C)查找(D)定位
3. 串的逻辑结构与( )的逻辑结构不同。
(A) 线性表(B)栈(C)队列(D)树
4. 二叉树第i(i≥1)层最多有( )个结点。
(A) 2i(B)2i (C) 2i-1(D) 2i-1
5. 设单链表中p指向结点A,若要删除A后结点(若存在),则需要修改p的操作为( )
(A) p.Next = p.Next.Next (B)p=p.Next
(C)p=p.Next.Next (D)p.Next=p
6. 设一数列的输入顺序为1,2,3,4,5,6,通过栈操作不可能排成的输出序列为( )
(A) 3,2,5,6,4,1 (B) 1,5,4,6,2,3
(C) 2,4,3,5,1,6 (D) 4,5,3,6,2,1
7. 设字符串S1=’ABCDEFG’,S2=’PQRST’,则运算S=CONCA T(SUB(S1,2,LENGTH(S2)),SUB(S1,LENGTH(S2),2))的结果为( )
(A) ‘BCQR’(B) ‘BCDEF’(C) ’BCDEFG’(D) ‘BCDEFEF’
8. 有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占1个地址空间,则a85地址为( )
(A)13 (B) 33 (C) 18 (D) 40
9. 如果结点A有3个兄弟,而且B为A的双亲,则B的度为( )
(A) 3 (B) 4 (C) 5 (D) 1
10. 线索化二叉树中某结点D没有左孩子的必要条件是( )
(A) D.Lchild=null (B) D.ltag=1
(C) D.Rchild=null (D) D.ltag=0
二、填空题(20分)
1. 对于一个以顺序实现的循环队列Q[0..m_1],队头、队尾指针分别为f,r,其判空的条件是
,判满的条件是。
2. 循环链表的主要优点是。
3. 给定一个整数集合{3,5,6,9,12},画出其对应的一棵Huffman树。
4 双向循环链表中,在p所指的结点之后插入f所指的结点,其操作为。
5. 下列为朴素的模式匹配算法,请在算法的处填入正确的子句。
public int insert(string s, string t)
{
int i = 0;
int j = 0;
while (i < s.Length && j < t.Length)
{
if (s[i] == t[j])
{
i = i + 1;
j = j + 1;
}
else
{
i =
j =
}
}
if (j == t.Length)
{
return i - t.Length;
}
else
{
return -1;
}
}
6. 一个n*n的对称矩阵,如果以行或列为主序存入内存,则其容量为。
7. 设F是森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有。
8. 前序序列和中序序列相同的二叉树为。
9. 已知一棵二叉树的中序遍历结果为DBHEAFICG,后序遍历结果为DHEBIFGCA,画出该二叉树。
三、应用题(18分)
1. 设二叉树的顺序存储结构如下。
(6分)
(1)根据其存储结构画出三叉树;
(2)写出按前序、中序、后序遍历该二叉树所得的结点序列。
(3)画出二叉树的后序线索树。
2. 一棵完全二叉树共有21个结点,现顺序存放在一个向量中,向量的下标正好为结点的序号,请问有序号为12的双亲结点存在吗?为什么(4分)
3. 线性表有两种存储结构:一是顺序表,二是链表,简述它们各自的优缺点。
(4分)
4. 什么是队列的“假溢”现象?如何解决(4分)
四、算法设计(42分)
1. 试写出求二叉树结点数目的算法。
(15分)
2. 设a=(a1,a2,…,a m)和b=(b1,b2,…,b n)是两个单链表,写出将这两个表合并为单链表c的算法。
(17分)
⎩
⎨⎧>≤=++n m a a b a b a b a n m b b b a b a b a c m n n n n m m m ),...,,,...,,,,(),...,,,...,,,,(1221112211 3. 已知一个单链表中的每个结点存放一个整数,并且结点数不少于2.试设计算法以判断该链表中从第二项起的每个元素值是否等于其序号的平方减去其前驱的值,若满足,返回True ,否则返回False 。
(10分)
模拟试题1参考答案
一、选择题
二、填空题
1. r =f ,(r+1)% m = f
2. 从任一结点出发可以遍历链表中的所有结点
3.
4.
(1)f.Next = p.Next;
(2)p.Next.Prev=f;
(3)f.Prev = p;
(4)p.Next = f;
5. i-j-1,0
6. n(n+1)/2
7. n+1
8. 单右支二叉树或孤立结点
9.
三、应用题
1. 答:
(1)该存储结构对应的二叉树为:
(2)前序序列为E A D C B F H G I
中序序列为A B C D E F G H I
后序序列为B C D A G I H F E
(3)后序线索树为:
Null
2. 存在,12的双亲结点为6
3. 顺序表方便查找,链表方便插入和删除操作;
4. 空间够,但不能插入数据,采用循环链表解决该问题。
四、算法设计
1. 解答:依题意,设二叉树采用链表结构,计算一棵二叉树的所有结点的递归模型如下。
f(t)=0 root=null
f(t)=1 root.LChild=null 且root.RChild=Null
f(t)=f(root.LChild) +f(root.RChild)+1 其他
因此,实现本题功能的方法为:
public int nodes(Node<T> root)
{
int num1=0;
int num2=0;
if (root == null)
{
return 0;
}
else
{
num1 = nodes(root.LChild);
num2 = nodes(root.RChild);
}
return num1 + num2 + 1;
}
2. 解答:算法描述如下
public LinkList<T> Merge(LinkList<T> Ha, LinkList<T> Hb) {
LinkList<T> Hc;
LinkList<T> Qa;
LinkList<T> Qb;
LinkList<T> Qc;
if(Ha==null)
{
Hc=Hb;
}
if(Hb==null)
{
Hc=Ha;
}
if(Ha!=null&&Hb!=null)
{
Qa=Ha;
Qb=Hb;
Hc=Ha;
Qa=Qa.Next;
Hc.Next=Qb;
while(Ha!=Qa&&Hb!=Qb)
{
Qc.Next=Qa;
Qc=Qa;
Qa=Qa.Next;
Qc.Next=Qb;
Qc=Qb;
Qb=Qb.Next;
}
if(Ha==Qa)
{
while(Hb!=Qb)
{
Qc.Next=Qb;
Qc=Qb;
Qb=Qb.Next;
}
}
if(Hb==Qb)
{
while(Ha!=Qa)
{
Qc.Next=Qb;
Qc=Qa;
Qa=Qa.Next;
}
}
Qc.Next=Hc;
}
return Hc;
}
3. 解答
public int Judge(LinkList<T> Head)
{
bool flag=false;
int i=2;
LinkList<T> P;
LinkList<T> Q;
Q=Head.Next;
while(P!=null)
{
if(P.Data==i*i-Q.Data)
{
flag=true;
}
else
{
return false;
}
Q=P;
P=P.Next;
++i;
}
return flag;
}。