中北大学数据结构习题Word格式文档下载.docx
《中北大学数据结构习题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中北大学数据结构习题Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
7.若一个栈的输入序列为1,2,3,,,n,输出序列的第一个元素是i,则第j个
输出元素是(D)。
A.i-j-1B.i-jC.j-i+1D.不确定的
8.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是(C)。
A.top:
=top+1;
V[top]:
=xB.V[top]:
=x;
top:
=top+1
C.top:
=top-1;
=xD.V[top]:
=top-1
9.表达式a*(b+c)-d的后缀表达式是(B)。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd
10.表达式3*2A(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为
(D),其中a为乘幕0
A.3,2,4,1,1;
*a(+*-B.3,2,8;
*A-
B.C.3,2,4,2,2;
*a(-d.3,2,8;
*a(-
11.循环队列存储在数组A[0..m]中,则入队时的操作为(D)。
A.rear=rear+1B.rear=(rear+1)mod(m-1)
C.rear=(rear+1)modmD.rear=(rear+1)mod(m+1)
12.设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是(C)。
A.6B.4C.3D.2
13.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值
分别为多少?
(B)
解析:
Q.front=(Q.front+1)%Q.queuesize;
Q.rear=(Q.rear+1)%Q.queuesize;
A.1和5B.2
C.4
14.循环队列A[0..m-1]存放其元素值,用
则当前队列中的元素数是(A)0
A.(rear-front+m)%mB.rear-front+1
和2D.5和1
front和rear分别表示队头和队尾,
C.rear-front-1D.
rear-front
当队列非空时,可执行如下的出队操作:
当队列非满时,可执行如下的入队操作:
应用题
1.在程序设计中,可采用下列三种方法实现输出和输入:
⑴通过scanf和printf语句;
(2)通过函数的参数显式传递;
(3)通过全局变量隐式传递。
试讨论这三种方法的优缺点。
答:
(1)用scanf和printf直接进行输入输出的好处是形象、直观,但缺点是需要对其进行格式控制,较为烦琐,如果出现错误,则会引起整个系统的崩溃。
⑵通过函数的参数传递进行输入输出,便于实现信息的隐蔽,减少出错的可能(3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使程序的维护较为困难。
2.线性表有两种存储结构:
一是顺序表,二是链表。
(1)如果有n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。
在此情况下,应选用哪种存储结构?
为什么?
(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度
存取线性表中的元素,那么应采用哪种存储结构?
为什么?
(1)选链式存储结构。
它可动态申请内存空间,不受表长度(即表中元素
个数)的影响,插入、删除时间复杂度为O
(1)
(2)选顺序存储结构。
顺序表可以随机存取,时间复杂度为O
(1)
3.设pa,pb分别指向两个带头结点的有序(从小到大)单链表。
仔细阅读如下的程序,并回答问题:
(1)程序的功能。
(2)s1,s2中值的含义。
(3)pa,pb中值的含义。
Voidexam(node*pa,node*pb)
{node*p,*p1,*p2;
ints1,s2;
p1=pa->
p2=pb->
pa->
next=null;
s1=0;
s2=0;
While(p1&
&
p2)
{if(p1->
data<
p2->
data)
{p=p1;
p1=p1->
s2=s2+1;
delete(p)};
elseif(p1->
data>
data)p2=p2->
else(p1->
data==p2->
next=pa->
p2=p2->
s1=s1+1;
};
}
While(p1){p=p1;
delete(p);
s2=s2+1}
解:
本程序段功能是将pa和pb链表中的值相同的结点保留在pa链表中(pa中与pb中不同结点删除),pa是结果链表的头指针。
链表中结点值与从前逆序。
S1记结果链表中结点个数(即pa与pb中相等的元素个数)。
S2记原pa链表中删除的结点个数。
算法题
1.写出下图双链表中对换值为23和15的两个结点相互位置时修改指针的有关
语句。
结点结构为:
(pre,data,next)
设q=p->
贝U
next->
pre=q->
pre=p
2.顺序结构线性表LA与LB的结点关键字为整数。
LA与LB的元素按非递减有序,线性表空间足够大。
试给出一种高效算法,将LB中元素合到LA中,使新的LA
的元素仍保持非递减有序。
高效指最大限度的避免移动元素。
VoidUnion(seqlistLA,seqlistLB)
{m=LA.length;
n=LB.length;
k=m+n-2;
i=m-1;
j=n-1;
while(i>
=0&
j>
=0)
{if(LA.elem[i]>
=LB.elem[j])
{LA.elem[k]=LA.elem[i];
k=k-1;
i=i-1;
else{LA.elem[k]=LB.elem[j];
j=j-1;
while(j>
=0){LA.elem[k]=LB.elem[j];
}}
3.给定一个带表头结点的单链表,设head为头指针,结点的结构为
(data,next),data为整型元素,next为指针;
试写出算法:
按递增次序输出单链
表中各结点的数据元素,并释放结点所占的存储空间。
(要求;
不允许使用数组
作辅助空间)
voidMiniDelete(LinkedListhead)
{LinkedList*pre,*p,*u;
while(head->
next!
=null)//循环到仅剩头结点。
{pre=head;
p=pre->
//p为工作指针,pre为最/4值的前驱
while(p->
=null)
{if(p->
data)pre=p;
p=p->
}//记住当前最小值结点的前驱
print(%2d,pre->
data);
//输出最小值。
u=pre->
next=u->
free(u);
//删除最小结点
free(head);
//释放头结点。
4,试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x);
intLocateElem_L(LinkList&
L,ElemTypex)
{
inti=0;
LinkListp=L;
while(p&
data!
=x){
i++;
if(!
p)return0;
elsereturni;
}5,已知单链表中的元素以值递增有序排列。
试写一高效的算法,删除表中所有值大于mink且小于maxk的元素,同时释放被删结点空间。
pre
匚[
umaxk^=maL?
cl<
pre-^itext=p二
voiddelete(LinkList&
L,intmink,intmaxk){p=L->
=mink)
{pre=p;
}//查找第一个值>
mink的结点
if(P){
maxk)p=p->
//查找第一个值>
maxk的结点
q=pre->
//修改指针
while(q!
=p)
{s=q->
deleteq;
q=s;
}//释放结点空间
}//delete6.试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度。
已知一个非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素
从集合B取出物件放入集合A
要求集合A中同样物件不能有两件以上
因此,算法的策略应该和例2-1基本相同,差别仅在于集合A的初始状态是“空集”
voidunion(List&
La,ListLb){
InitList(La);
//构造(空的)线性表LA
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1;
i<
=Lb_len;
i++){
GetElem(Lb,i,e);
//取Lb中第i个数据元素赋给e
LocateElem(La,e,equal()))
ListInsert(La,++La_len,e);
//LaG未存在和e相同的数据元素,则插入之
}//for
}//union
例如:
(2,3,3,5,6,6,6,8,12)
对集合B而言,
值相同的数据元素必定相邻
对集合A而言,
数据元素依值从小至大的顺序插入
因此,数据结构改变了,
解决问题的策略也相应要改变。
voidpurge(List&
InitList(LA);
//求线性表的长度
if(ListEmpty(La)||!
equal(en,e)){
en=e;
}//La中不存在和e相同的数据元素,则插入之
}//purge
第四章串习题
1.下面关于用的的叙述中,哪一个是不正确的?
A.用是字符的有限序列B.空用是由空格构成的用
C.模式匹配是用的一种重要运算D.用既可以采用顺序存储,也可以采用链
式存储
2.设有两个用p和q,其中q是p的子用,求q在p中首次出现的位置的算法称为(C)
A.求子用B.联接C.匹配D.求用长
3.用'
ababaaababaa'
的next数组为(C)。
A.012345678999B.012121111212C.011234223456D.0123012322345
4.字符用'
ababaabab'
的nextval为(A)
A.(0,1,0,1,0,4,1,0,1)B.(0,1,0,1,0,2,1,0,1)
C.(0,1,0,1,0,0,0,1,1)D.(0,1,0,1,0,1,0,1,1)
5、设字符用S='
aabaabaabaac'
T='
aabaac'
(1)给出S和T的next值和nextval值;
(2)若S作主用,T作模式用,试给出利用BF算法和KMPJ法的匹配过程。
(1)S的next与nextval值分另为012123456789和002002002009;
t的next与nextval值分别为012123和002003。
(2)利用BF算法的匹配过程:
第——趟匹酉己:
aabaabaabaac
aabaac(i=6,j=6)
第二趟匹酉己:
aabaabaabaacaa(i=3,j=2)
(aa)baac
第三趟匹酉己:
aabaabaabaaca(i=3,j=1)
(成功)(aa)baac
第四趟匹酉己:
aabaabaabaacaabaac(i=9,j=6)
第五趟匹酉己:
aabaabaabaacaa(i=6,j=2)
第六趟匹酉己:
aabaabaabaaca(i=6,j=1)
第七趟匹酉己:
利用KMPJ法的匹配过程:
成功)
aabaac(i=13,j=7)
第6章树和二叉树习题
1、已知一算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为(D)
A.-A+B*C/DEB.-A+B*CD/E
C.-+*ABC/DED.-+A*BC/DE
2、设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和
M3与森林F对应的二叉树根结点的右子树上的结点个数是(D)。
A.M1
B.M1+M2C
.M2+M3
3、有关二叉树下列说法正确的是(
A.二叉树的度为2
B.一棵二叉树白度可以小于2
C.二叉树中至少有一个结点的度为
D.二叉树中任何一个结点的度都为4、二叉树的第I层上最多含有结点数为(C)
A.2IB.2I-1-1C.2I-1D.2I-15、一个具有1025个结点的二叉树的高八为(C)
10至1024之间
A.11B.10C.11至1025之间D
具有n
6、高度为K的二叉树最大的结点数为(C)。
A.2kB.2k-1C.2k-1D.2k-1-1
7、利用二叉链表存储树,则根结点的右指针是(C)。
A.指向最左孩子B.指向最右孩子
C.空D.非空
8、对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C)次序的遍历实现编号。
A.先序B.中序C.后序D.从根开始按层次遍历
9、某二叉树中序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E则先序序列是:
B
A.E,G,F,A,C,D,BB.E,A,C,B,D,G,FC.E,A,G,C,F,B,DD.上面的都不对
10、上题的二叉树对应的森林包括多少棵树(B)
A.lB.2C.3D.概念上是错误的
11、一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树
一定满足(C)
A.所有的结点均无左孩子B.所有的结点均无右孩子
C.只有一个叶子结点D.是任意一棵二叉树
12、在二叉树结点的先序序列,中序序列和后序序列中,所有叶子结点的先后
顺序(B)
A.都不相同B.完全相同
C.先序和中序相同,而与后序不同D.中序和后序相同,而与先序不同13、在完全二叉树中,若一个结点是叶结点,则它没(C)。
A.左子结点B.右子结点
C.左子结点和右子结点D.左子结点,右子结点和兄弟结点
14、n个结点的线索二叉树上含有的线索数为(C)
A.2nB.n-lC.n+1D.n
(解析:
一棵n结点树包含n-1条边,而每个结点有两个指针域即总共2n个指针,减去表示
边的指向关系(即左右子树)的n-1条边,剩下n+1条边即为线索。
)
15、下述编码中哪一个不是前缀码(B)。
A.(00,01,10,11)B.(0,1,00,11)
C.(0,10,110,111)D.(1,01,000,001)
一组编码中任何一个编码均不为其他编码的前缀.避免了多义性,且缩短了报文总
长)
16、在下述结论中,正确的是(D)
①只有一个结点的二叉树的度为0;
②二叉树的度为2;
③二叉树的左右子树可任意交换;
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①②③B.②③④C.②④D.①④
17、若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B)
A.9B.11C.15D.不确定
任意一棵二叉树,度为零的节点即叶子节点的数比度为二的节点多一。
)18、具有10个叶结点的二叉树中有(B)个度为2的结点
A.8B.9C.10D.1l
19、一棵完全二叉树上有1001个结点,其中叶子结点的个数是(D)
(1023是满二叉树,有512片叶子。
1001比1023少22个结点,所以有512-22+22/2=501片叶子。
511是满二叉树,有256片叶子。
1001比511多490个结点,所以有256+490-(490+1)/2=501片叶子。
所以答案就是501了。
A.250B.500C.254D.501
20、有n个叶子的哈夫曼树的结点总数为(D)。
A,不确定B.2nC.2n+1D.2n-1
21、二叉树的先序遍历和中序遍历如下:
先序遍历:
EFHIGJK中序遍历:
HFIEJKG。
该二叉树根的右子树的根是(C)。
A、EB、FC、GD、H
22、设森林F对应的二叉树为B,它有m个结点,B的根为p,p的右子树结点个数为n,森林F中第一棵树的结点个数是(A)
A.m-nB.m-n-1C.n+1D.条件不足,无法确定
23、用一维数组存储二叉树时,总是以(D)遍历顺序存储结点
A.先序B.中序C.后序D,按层次遍历
24、对一棵二叉树进行层次遍历时,应借助于一个(D)。
A.顺序表B.数组C.栈D.队列
25、某二叉树的先序序列和后序序列正好相反,则该二叉树一定是(C)的二叉
树。
A.空或只有一个结点B.任一结点无左子树C,高度等于其结点数D.任一结点无右子树
26、设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1则T中的叶子数为(D)
A.5B.6C.7D.8
(设度为0的结点数为n0,度为1的结点数为n1,度为2的结点数为n2,度为3的结点数为n3,度为4的结点数为n4,那么这棵树总的结点数为n0+n1+n2+n3+n4;
又因为树中的每个结
点(除了根结点外)都有一个指针指向它,那么这棵树总的结点数为总的指针数加上1;
总的指针数=1*n1+2*n2+3*n3+4*n4;
故有:
1+1*n1+2*n2+3*n3+4*n4=n0+n1+n2+n3+n4;
从而有
n0=1+n2+2*n3+3*n4=1+2+2*1+3*1=8;
27、将一棵树t转换为孩子一兄弟链表表示的二叉树h,则t的后根序遍历是h的(B)
A.先序遍历B.中序遍历C.后序遍历
28、某二叉树T有n个结点,设按某种顺序对T中的每个结点进行编号,编号为1,2,,,n,且有如下性质:
T中任一结点V,其编号等于左子树上的最小编号减1,而V的右子树的结点中,其最小编号等于V左子树上结点的最大编号加1。
这时是按(B)编号的。
A.中序遍历序列B.先序遍历序列C.后序遍历序列D.层次顺序
1、从概念上讲,树,森林和二叉树是三种不同的数据结构,将树,森林转化为二叉树的基本目的是什么,并指出树和二叉树的主要区别。
树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质是一样的,只是解释不同,也就是说树(森林的特例)可用二叉树唯一表示,并可使用二叉树的一些算法去解决树和森林中的问题。
树和二叉树的区别有:
一是二叉树的度至多为2,树无此限制;
二是二叉树有左右子树之分,即使在只有一个分枝的情况下,也必须指出是左子树还是右子树,树无此限制。
2、试找出满足下列条件的二叉树
1)先序序列与后序序列相同;
2)中序序列与后序序列相同;
3)先序序列与中序序列相同;
1)、既不含左子树,也不含右子树的二叉树。
2)、不含右子树的二叉树。
3)、不含左子树的二叉树。
3、已知一棵度为k的树中有ni个度为1的结点,奥个度为2的结点,一①个度为k的结点,问该树中有多少个叶子结点?
根据树的定义,在一颗树中,除树根结点外,每个结点有且仅有一个前驱结点,也就是说,每个结点与指向它的一个分支一一对应,所以除树根结点之外的结点树等于所有结点的分支数,即度数,从而可得树中的结点数等于所有结点的度数加1。
总结点数为
1n12n23n3…knk
而度为0的结点数就应为总结点数减去度不为0的结点数的总和,即
k
n0=1n12n23n3...knk-(n〔n2n3…nk)=1%(i—1)n
i-J
5、用一维数组存放的一棵完全二叉树如下图所示:
A
C
D
E
F
G
H
I
J
K
L
写出后序遍历该二叉树时访问结点的顺序。
用一维数组存储二叉树时,总是以层次遍历顺序存储结点
HIDJKEBLFGCA
6、对下图所示二叉树分别按先序、中序、后序遍历,给出相应的结点序列,同时给二叉树加上中序线索。
(1)先序序列:
ABDEHCFG
(2)中序序列:
DHEBAFCG
(3)后序序列:
HEDBFGCA
7、设一棵二叉树的先序、中序遍历序列分别为先序遍历序列:
Cnull
ABDFCEGH中
序遍历JWhBFDAGEHC
(1)画出这棵二叉树。
(2)将这棵二叉树转换成对应的树(或森林)
尸"