2、若将数据结构定义为一个二元组(D,R),说明符号D,R应分别表示什么?
一、1CB2D确定性:
算法的每一条指令必须有确切的含义,理解时不会产生二义性,并且在任何条件下都只有一条执行路径。
可行性:
一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
3C4C5D二、1×2√三、1、O(n)2、D是数据元素的有限集合,S是D上数据元素之间关系的有限集合。
第二章复习题
本章重点掌握:
线性结构特点,顺序存储结构和链式存储结构特点。
1.在顺序表中插入或删除一个元素,需要平均移动(一半)元素,具体移动的元素个数与(插入或删除的位置)有关。
插入时平均次数(n/2),删除时平均次数((n-1)/2)。
2.有一个含头结点的循环链表,头指针为head,则其为空的条件是:
(C)
A)head==NULLB)head->next==NULL
C)head->next==head
3.在长度为n的顺序表的第i个位置上插入一个元素(1≤i≤n+1),元素的移动次数为:
(A)
A)n–i+1B)n–iC)iD)i–1
4对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为(C)
A)顺序表B)用头指针表示的循环单链表
C)用尾指针表示的循环单链表D)单链表
5设单链表中结点的结构为(data,link)。
已知指针q所指结点是指针p所指结点的直接前驱,若在*q与*p之间插入结点*s,则应执行下列哪一个操作?
(B)
(A)s->link=p->link;p->link=s;(B)q->link=s;s->link=p;
(C)p->link=s->link;s->link=p;(D)p->link=s;s->link=q;
4.设单链表中结点的结构为(data,link)。
已知指针p所指结点不是尾结点,若在*p之后插入结点*s,则应执行下列哪一个操作?
(B)
(A)s->link=p;p->link=s;(B)s->link=p->link;p->link=s;
(C)s->link=p->link;p=s;(D)p->link=s;s->link=p;
5.设单链表中结点的结构为(data,link)。
若想摘除结点*p的直接后继,则应执行下列哪一个操作?
(A)
(A)p->link=p->link->link;(B)p=p->link;p->link=p->link->link;
(C)p->link=p->link;(D)p=p->link->link;
6.设单循环链表中结点的结构为(data,link),且rear是指向非空的带表头结点的单循环链表的尾结点的指针。
若想删除链表第一个结点,则应执行下列哪一个操作?
(D)
(A)s=rear;rear=rear->link;deletes;
(B)rear=rear->link;deleterear;
(C)rear=rear->link->link;deleterear;
(D)s=rear->link->link;rear->link->link=s->link;deletes;
(rear指向尾结点,rear->link->link指向第一个结点,第一个结点变为原来的第二个结点)
7设双向循环链表中结点的结构为(data,lLink,rLink),且不带表头结点。
若想在指针p所指结点之后插入指针s所指结点,则应执行下列哪一个操作?
(D)
(E)p->rLink=s;s->lLink=p;p->rLink->lLink=s;s->rLink=p->rLink;
(F)p->rLink=s;p->rLink->lLink=s;s->lLink=p;s->rLink=p->rLink;
(G)s->lLink=p;s->rLink=p->rLink;p->rLink=s;p->rLink->lLink=s;
(H)s->lLink=p;s->rLink=p->rLink;p->rLink->lLink=s;p->rLink=s;
第三章
1.对于栈操作数据的原则是( )。
A.先进先出 B.后进先出 C.后进后出 D.不分顺序
2.在作进栈运算时,应先判别栈是否( ① ),在作退栈运算时应先判别栈是否(② )。
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③ )。
为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的(④ )分别设在这片内存空间的两端,这样,当( ⑤ )时,才产生上溢。
①,②:
A.空 B.满 C.上溢 D.下溢
③:
A.n-1 B.n C.n+1 D. n/2
④:
A.长度 B.深度 C.栈顶 D.栈底
⑤:
A.两个栈的栈顶同时到达栈空间的中心点.
B.其中一个栈的栈顶到达栈空间的中心点.
C.两个栈的栈顶在栈空间的某一位置相遇.
D.两个栈均不空,且一个栈的栈顶到达另一个栈的栈底.
3.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( )。
A.不确定 B.n-i+1 C. i D.n-i
4.有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?
( )
A.543612 B.453126 C.346521 D.234156
5.设栈的输入序列是1,2,3,4,则( )不可能是其出栈序列。
A.1,2,4,3, B.2,1,3,4, C.1,4,3,2,
D.4,3,1,2, E.3,2,1,4,
6.输入序列为ABC,可以变为CBA时,经过的栈操作为( )
A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop
C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop
7.用链接方式存储的队列,在进行删除运算时()。
A.仅修改头指针B.仅修改尾指针C.头、尾指针都要修改D.头、尾指针可能都要修改
8.假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为()。
A.(rear-front+m)%mB.rear-front+1C.(front-rear+m)%mD.(rear-front)%m
9.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?
()
A.1和5B.2和4C.4和2D.5和1
10.判定一个循环队列QU(最多元素为m0)为空的条件是____。
A.rear-front==m0B.rear-front-1==m0
C.front==rearD.front==rear+1
11.判定一个循环队列QU(最多元素为m0,m0==Maxsize-1)为满队列的条件是____。
A.((rear-front)+Maxsize)%Maxsize==m0
B.rear-front-1==m0C.front==rearD.front==rear+1
1.B.3.B4C5D6.B7D8A9.B
第五章复习题
1.求下列广义表运算的结果:
HEAD[TAIL[HEAD[((a,b),(c,d))]]]; b
TAIL[HEAD[TAIL[((a,b),(c,d))]]]; (d)
2.假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。
已知A的基地址为1000,计算:
(1)数组A共占用多少字节;(288)
(2)数组A的最后一个元素的地址;(1282)1288-6
(3)按行存储时,元素A36的地址;(1126)1000+(2*8+5)*6
(4)按列存储时,元素A36的地址;(1192)1000+(5*6+2)*6
[注意]:
定义数组的下标从1开始。
3.已知一个3行、4列的二维数组A(各维下标均从1开始),如果按“以列为主”的顺序存储,则排在第8个位置的元素是:
A[2,3]。
因为每列上有3个元素,所以8%3=2就是所在行数
4.广义表(((a),b),c)的表头是((a),b),表尾是(c)。
(√)
5.数组元素的下标值越大,存取时间越长。
(×)数组是随机存取
6.利用广义表的head和tail操作写出函数表达式,把以下各题中的单元素banana从广义表中分离出来:
(1)L1(apple,pear,banana,orange)
Head(Tail(Tail(L1)))
(2)L2((apple,pear),(banana,orange))
Head(Head(Tail(L2)))
(3)L3(((apple),(pear),(banana),(orange)))
Head(Head(Tail(Tail(Head(L3)))))
7.填空题
(1)广义表A(a),则表尾为________。
A.aB.(())C.空表D.(a)
(2)广义表A((x,(a,b)),(x,(a,b),y)),则运算Head(Head(Tail(A)))为()。
A.xB.(a,b)C.(x,(a,b))D.A
(3)下列广义表是线性表的有()。
A.E(a,(b,c))B.E(a,E)C.E(a,b)D.E(a,L())
第六章复习题
1.列出图所示二叉树的叶结点、分支结点和每个结点的层次。
【解答】
二叉树的叶结点有⑥、⑧、⑨。
分支结点(度不为0的结点)有①、②、③、④、⑤、⑦。
结点①的层次为1;结点②、③的层次为2;结点④、⑤、⑥的层次为3;结点⑦、⑧的层次为4;结点⑨的层次为5。
2.使用
(1)顺序表示和
(2)二叉链表表示法,分别画出上图所示二叉树的存储表示。
【解答】
1
2
3
4
0
5
6
0
7
0
0
0
8
0
0
0
0
9
顺序表示
∧
二叉链表表示
3.如果一棵树有n1个度为1的结点,有n2个度为2的结点,…,nm个度为m的结点,试问有多少个度为0的结点?
试推导之。
【解答】
总结点数n=n0+n1+n2+…+nm
总分支数e=n-1=n0+n1+n2+…+nm-1
=m*nm+(m-1)*nm-1+…+2*n2+n1
则有
4.试分别找出满足以下条件的所有二叉树:
(1)二叉树的前序序列与中序序列相同;
(2)二叉树的中序序列与后序序列相同;
(3)二叉树的前序序列与后序序列相同。
【解答】
(1)二叉树的前序序列与中序序列相同:
空树或缺左子树的单支树;
(2)二叉树的中序序列与后序序列相同:
空树或缺右子树的单支树;
(3)二叉树的前序序列与后序序列相同:
空树或只有根结点的二叉树。
5.请画出右图所示的树所对应的二叉树。
1
【解答】
1
2
2
5
4
4
3
3
对应二叉树
5
7
6
6
8
8
7
6.已知一棵二叉树的先序遍历的结果是ABECDFGHIJ,中序遍历的结果是EBCDAFHIGJ,试画出这棵二叉树。
【解答】
当前序序列为ABECDFGHIJ,中序序列为EBCDAFHIGJ时,逐步形成二叉树的过程如下图所示:
A
A
A
A
F
B
B
F
F
B
G
E
C
G
E
C
HIGJ
CD
E
FHIGJ
H
D
J
HI
J
D
EBCD
I
7.已知一棵树的先根次序遍历的结果与其对应二叉树表示(孩子-兄弟表示)的前序遍历结果相同,树的后根次序遍历结果与其对应二叉树表示的中序遍历结果相同。
试问利用树的先根次序遍历结果和后根次序遍历结果能否唯一确定一棵树?
举例说明。
【解答】
因为给出二叉树的前序遍历序列和中序遍历序列能够唯一地确定这棵二叉树,因此,根据题目给出的条件,利用树的先根次序遍历结果和后根次序遍历结果能够唯一地确定一棵树。
例如,
1
1
2
2
对应二叉树
3
5
4
4
3
5
6
7
6
8
7
8
对应二叉树的先序序列为1,2,3,4,5,6,8,7;中序序列为3,4,8,6,7,5,2,1。
树的先根遍历序列为1,2,3,4,5,6,8,7;后根遍历序列为3,4,8,6,7,5,2,1。
8.给定权值集合{15,03,14,02,06,09,16,17},构造相应的赫夫曼树,并计算它的带权外部路径长度。
【解答】
(Ⅰ)
05
17
16
09
06
14
15
17
16
09
06
02
14
15
02
03
03
(Ⅱ)
17
16
09
14
15
20
16
14
15
(Ⅲ)
17
11
09
11
06
05
02
03
06
05
(Ⅴ)
33
20
29
02
03
29
16
17
20
(Ⅳ)
16
17
11
09
15
14
14
11
09
15
05
06
06
05
02
03
02
03
82
(Ⅶ)
49
33
(Ⅵ)
49
33
17
29
20
16
17
16
29
20
14
11
09
15
11
09
15
14
06
05
06
05
03
02
03
02
此树的带权路径长度WPL=229。
9.假定用于通信的电文仅由8个字母c1,c2,c3,c4,c5,c6,c7,c8组成,各字母在电文中出现的频率分别为5,25,3,6,10,11,36,4。
试为这8个字母设计不等长Huffman编码,并给出该电文的总码数。
【解答】
已知字母集{c1,c2,c3,c4,c5,c6,c7,c8},频率{5,25,3,6,10,11,36,4},则Huffman编码为
c1
c2
c3
c4
c5
c6
c7
c8
0110
10
0000
0111
001
010
11
0001
电文总码数为4*3+4*4+3*10+3*11+4*5+4*6+2*25+2*36=257
1
0
100
1
39
61
1
0
0
1
1
0
0
C2
17
22
36
25
C7
7
11
11
10
1
1
0
0
C6
C5
5
6
3
4
C4
C1
C8
C3
10.填空题
(1)对于一棵具有n个结点的树,该树中所有结点的度数之和为_n-1_。
(度数和就是树的分支数,因此为n-1)
(2)假定一棵三叉树的结点个数为50,则它的最小高度为___5___,最大高度为__50__。
(最小高度是满三叉树,最大高度为单支树)
(3)在一棵二叉树中,假定度为2的结点有5个,度为1的结点有6个,则叶子结点数有__6__个。
(n0=n2+1)
(4)对于一棵具有n个结点的二叉树,对应二叉链表中指针总数为__2n_个,其中__n-1_个用于指向子女结点,_n+1_个指针空闲着。
(见教材p126)
(5)在一个小顶堆中,堆顶结点的值是所有结点中的_最小者__,在一个大顶堆中,堆顶结点的值是所有结点中的__最大者__。
(6)当从一个小顶堆中删除一个元素时,需要把_最后__元素填补到__堆顶__位置,然后再按条件把它逐层调整。
(7)在赫夫曼编码中,若编码长度只允许小于等于4,则除了已对两个字符编码为0和10外,还可以最多对__4__个字符编码。
(8)设二叉树有n个结点且根结点处于第1层,则其高度为(不确定)。
(9)设高度为h二叉树只有度为2和度为0的结点,则该二叉树中所含结点至少有(2h-1)个。
(除第一层之外,每层都有2个结点)
(10)设森林F中有4棵树,第1、2、3、4棵树的结点个数分别为n1、n2、n3、n4,当把森林F转换成一棵二叉树后,其根结点的右子树中有(n2+n3+n4)个结点。
(11)设森林F中有4棵树,第1、2、3、4棵树的结点个数分别为n1、n2、n3、n4,当把森林F转换成一棵二叉树后,其根结点的左子树中有(n1-1)个结点。
(12)将含有82个结点的完全二叉树从根结点开始顺序编号,根结点为第0号,其他结点自上向下,同一层自左向右连续编号。
则第40号结点的双亲结点的编号为(19)。
(编号为i的结点,左孩子编号2i+1,右孩子2i+2)
(13)高度为h的完全二叉树最少有2h-1个结点。
(第h层只有一个结点)
(14)某二叉树结点的中序序列为A、B、C、D、E、F、G,后序序列为B、D、C、A、F、G、E,则其左子树中结点数目为:
(C)
A)3B)2C)4D)5
11.n个结点可构造出多少种不同形态的二叉树?
【解答】见教材p155
有种。
12.判断下列叙述的对错。
如果正确,在题前打“”,否则打“”。
(1)若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的先序遍历结果序列的最后一个结点。
(最右下结点有左孩子无右孩子)
(2)若有一个结点是二叉树中某个子树的先序遍历结果序列的最后一个结点,则它一定是该子树的中序遍历结果序列的最后一个结点。
(最右下结点有左孩子无右孩子)
(3)若有一个叶子结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的先序遍历结果序列的最后一个结点。
(4)在哈夫曼树中,权值最小的结点离根结点最近。
(×)
(5)将一棵树转换为二叉树表示后,该二叉树的根结点一定没有右子树。
(√)
13.阅读理解题[说明下列递归过程的功能]
voidunknown(BinTreeNode*T,inta[],inti){
//指针T是完全二叉树的根指针。
if(T!
=NULL){
a[i]=T->data;
unknown(T->leftChild,a,2*i+1);
unknown(T->rightChild,a,2*i+2);
}
}
主程序调用方式unknown(BT.root,a,0);
//将完全二叉树所有结点从根开始,自顶向下,同一层自左向右连续编号,根结点的编号为0。
[答案]
将用二叉链表表示的完全二叉树转换为二叉树的顺序(数组)表示。
14.下面是一个使用栈stack实现对二叉树进行非递归先根遍历的函数,请在标号处填写合适的语句。
程序:
Voidpreorder(bitree*T)
{bitree*stack[m];
inttop;
if(T!
=NULL)
{top=1;
stack[top]=
(1);
while(
(2))
{p=stack[top];
top--;
printf(“%d”,p->data);
if(p->rchild!
=NULL){(3);stack[top]=p->rchild;}
if((4)){top++;(5);}
}
}
}
(1)T
(2)top>0
(3)top++
(4)p->lchild!
=NULL
(5)stack[top]=p-