c[i][j]=a[i][k]*b[k][j]
}
3.O(n
)
4.i=n-1;
while((i>=0)&&A[i]!
=k))
j--;
return(i);
4.O(n)
5.fact(n)
{if(n<=1)
return
(1);
else
return(n*fact(n-1));
}
5.O(n)
第2章线性表
习题2
一、单项选择题
1.线性表是________。
1.A
A.一个有限序列,可以为空B.一个有限序列,不可以为空
C.一个无限序列,可以为空D.一个无限序列,不可以为空
2.在一个长度为n的顺序表中删除第i个元素(0<=i<=n)时,需向前移动个元素。
2.A
A.n-iB.n-i+lC.n-i-1D.i
3.线性表采用链式存储时,其地址________。
3.D
A.必须是连续的B.一定是不连续的
C.部分地址必须是连续的D.连续与否均可以
4.从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较________个元素结点。
4.C
A.n/2B.nC.(n+1)/2D.(n-1)/2
6.设单链表中指针p指向结点m,若要删除m之后的结点(若存在),则需修改指针的操作为________。
6.A
A.p->next=p->next->next;B.p=p->next;
C.p=p->next->next;D.p->next=p;
7.在一个长度为n的顺序表中向第i个元素(0
7.B
A.n-iB.n-i+lC.n-i-1D.i
8.在一个单链表中,已知q结点是p结点的前趋结点,若在q和p之间插入s结点,则须执行8.B
A.s->next=p->next;p->next=s
B.q->next=s;s->next=p
C.p->next=s->next;s->next=p
D.p->next=s;s->next=q
9.以下关于线性表的说法不正确的是______。
9.C
A.线性表中的数据元素可以是数字、字符、记录等不同类型。
B.线性表中包含的数据元素个数不是任意的。
C.线性表中的每个结点都有且只有一个直接前趋和直接后继。
D.存在这样的线性表:
表中各结点都没有直接前趋和直接后继。
10.线性表的顺序存储结构是一种_______的存储结构。
10.A
A.随机存取B.顺序存取C.索引存取D.散列存取
13.在______运算中,使用顺序表比链表好。
13.C
A.插入 B.删除
C.根据序号查找 D.根据元素值查找
14.在一个具有n个结点的有序单链表中插入一个新结点并保持该表有序的时间复杂度是_______。
14.B
A.O
(1) B.O(n)
C.O(n2)D.O(log2n)
15.设有一个栈,元素的进栈次序为A,B,C,D,E,下列是不可能的出栈序列__________。
15.C
A.A,B,C,D,EB.B,C,D,E,A
C.E,A,B,C,DD.E,D,C,B,A
16.在一个具有n个单元的顺序栈中,假定以地址低端(即0单元)作为栈底,以top作为栈顶指针,当做出栈处理时,top变化为______。
16.C
A.top不变B.top=0C.top--D.top++
17.向一个栈顶指针为hs的链栈中插入一个s结点时,应执行______。
17.B
A.hs->next=s;
B.s->next=hs;hs=s;
C.s->next=hs->next;hs->next=s;
D.s->next=hs;hs=hs->next;
18.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队头指针和队尾指针,则判断队满的条件为________。
18.D
A.rear%n==frontB.(front+l)%n==rear
C.rear%n-1==frontD.(rear+l)%n==front
19.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队头指针和队尾指针,则判断队空的条件为________。
19.C
A.rear%n==frontB.front+l=rear
C.rear==frontD.(rear+l)%n=front
二、填空题
1.线性表是一种典型的_________结构。
1.线性
2.在一个长度为n的顺序表的第i个元素之前插入一个元素,需要后移____个元素。
2.n-i+1
3.顺序表中逻辑上相邻的元素的物理位置________。
3.相邻
4.要从一个顺序表删除一个元素时,被删除元素之后的所有元素均需_______一个位置,移动过程是从_______向_______依次移动每一个元素。
4.前移,前,后
7.当对一个线性表经常进行存取操作,而很少进行插入和删除操作时,则采用_______存储结构为宜。
相反,当经常进行的是插入和删除操作时,则采用_______存储结构为宜。
7.顺序,链接
8.顺序表中逻辑上相邻的元素,物理位置_______相邻,单链表中逻辑上相邻的元素,物理位置_______相邻。
8.一定,不一定
9.线性表、栈和队列都是_______结构,可以在线性表的______位置插入和删除元素;对于栈只能在_______位置插入和删除元素;对于队列只能在_______位置插入元素和在_______位置删除元素。
9.线性,任何,栈顶,队尾,队头
12.对于一个具有n个结点的单链表,在已知的结点p后插入一个新结点的时间复杂度为______,在给定值为x的结点后插入一个新结点的时间复杂度为_______。
12.O
(1),O(n)
14.设有一空栈,现有输入序列1,2,3,4,5,经过push,push,pop,push,pop,push,push后,输出序列是_________。
14.2、3
三、简答题
2.线性表的两种存储结构各有哪些优缺点?
2.线性表具有两种存储结构即顺序存储结构和链接存储结构。
线性表的顺序存储结构可以直接存取数据元素,方便灵活、效率高,但插入、删除操作时将会引起元素的大量移动,因而降低效率:
而在链接存储结构中内存采用动态分配,利用率高,但需增设指示结点之间关系的指针域,存取数据元素不如顺序存储方便,但结点的插入、删除操作较简单。
3.对于线性表的两种存储结构,如果有n个线性表同时并存,而且在处理过程中各表的长度会动态发生变化,线性表的总数也会自动改变,在此情况下,应选用哪一种存储结构?
为什么?
3.应选用链接存储结构,因为链式存储结构是用一组任意的存储单元依次存储线性表中的各元素,这里存储单元可以是连续的,也可以是不连续的:
这种存储结构对于元素的删除或插入运算是不需要移动元素的,只需修改指针即可,所以很容易实现表的容量的扩充。
4.对于线性表的两种存储结构,若线性表的总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素,应选用何种存储结构?
试说明理由。
4.应选用顺序存储结构,因为每个数据元素的存储位置和线性表的起始位置相差一个和数据元素在线性表中的序号成正比的常数。
因此,只要确定了其起始位置,线性表中的任一个数据元素都可随机存取,因此,线性表的顺序存储结构是一种随机存取的存储结构,而链表则是一种顺序存取的存储结构。
第4章数组和广义表
【例4-1】二维数组A的每一个元素是由6个字符组成的串,其行下标i=0,1,…,8,列下标j=1,2,…,10。
若A以行为主序存储元素,A[8][5]的物理地址与当A按列为主序存储时的元素()的物理地址相同。
设每个字符占一个字节。
A.A[8][5]B.A[3][10]C.A[5][8]D.A[0][9]
解:
二维数A是一个9行10列的矩阵,即A[9][10]。
按行存储时,A[8][5]是第85个元素存储的元素。
而按列存储时,第85个存储的元素是A[3][10]。
即正确答案为B。
习题4
一、单项选择题
1.已知二维数组A10×10中,元素a20的地址为560,每个元素占4个字节,则元素a10的地址为(2.A)。
A.520B.522C.524D.518
2.数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为(11.C)。
A.SA+141B.SA+144C.SA+222D.SA+225
第5章树
【例5-1】写出如图5-1所示的树的叶子结点、非终端结点、每个结点的度及树深度。
解:
(1)叶子结点有:
B、D、F、G、H、I、J。
(2)非终端结点有:
A、C、E。
(3)每个结点的度分别是:
A的度为4,C的度为2,E的度为3,其余结点的度为0。
(4)树的深度为3。
【例5-2】一棵度为2的树与一棵二叉树有什么区别?
解:
度为2的树有两个分支,但分支没有左右之分;一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能交换。
【例5-3】树与二叉树有什么区别?
解:
区别有两点:
(1)二叉树的一个结点至多有两个子树,树则不然;
(2)二叉树的一个结点的子树有左右之分,而树的子树没有次序。
【例5-4】分别画出具有3个结点的树和三个结点的二叉树的所有不同形态。
解:
如图5-2(a)所示,具有3个结点的树有两种不同形态。
如图5-2(b)所示,具有3个结点的二叉树有以下五种不同形态。
【例5-8】如图5-3所示的二叉树,试分别写出它的顺序表示和链接表示(二叉链表)。
解:
(1)顺序表示。
1
2
3
4
5
6
7
8
9
10
11
a
b
c
d
e
^
^
^
^
f
g
(2)该二叉树的二叉链表表示如图5-4所示。
【例5-14】假定用于通信的电文由8个字符A、B、C、D、E、F、G、H组成,各字母在电文中出现的概率为5%、25%、4%、7%、9%、12%、30%、8%,试为这8个字母设计哈夫曼编码。
解:
根据题意,设这8个字母对应的权值分别为(5,25,4,7,9,12,30,8),并且n=8。
(1)设计哈夫曼树的步骤如图5-13所示。
(2)设计哈夫曼编码
利用第八步得到的哈夫曼树,规定左分支用0表示,右分支用1表示,字母A、B、C、D、E、F、G、H的哈夫曼编码如下表示:
A:
0011B:
01C:
0010D:
1010
E:
000F:
100G:
11H:
1011
习题5
一、单项选择题
1.在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为(1.C)个。
A.4B.5C.6D.7
2.假设在一棵二叉树中,双分支结点数为15,单分支结点数为30个,则叶子结点数为(2.B)个。
A.15B.16C.17D.47
3.假定一棵三叉树的结点数为50,则它的最小高度为(3.C)。
A.3B.4C.5D.6
4.在一棵二叉树上第4层的结点数最多为(4.D)。
A.2B.4C.6D.8
5.用顺序存储的方法将完全二叉树中的所有结点逐层存放在数组中R[1..n],结点R[i]若有左孩子,其左孩子的编号为结点(5.B)。
A.R[2i+1]B.R[2i]C.R[i/2]D.R[2i-1]
6.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为(6.D)。
A.24B.48C.72D.53
三、填空题
6.对于一棵具有n个结点的二叉树,当进行链接存储时,其二叉链表中的指针域的总数为_______个,其中_______个用于链接孩子结点,_______个空闲着。
6.2n,n-1,n+1
7.在一棵二叉树中,度为0的结点个数为n0,度为2的结点个数为n2,则n0=______。
7.n2+1
8.一棵深度为k的满二叉树的结点总数为_______,一棵深度为k的完全二叉树的结点总数的最小值为_____,最大值为______。
8.2k-1,2k-1,2k-1
9.由三个结点构成的二叉树,共有____种不同的形态。
9.5
12.对于一棵具有n个结点的二叉树,若一个结点的编号为i(1≤i≤n),则它的左孩子结点的编号为________,右孩子结点的编号为________,双亲结点的编号为________。
12.2i,2i+1,i/2(或i/2)
13.对于一棵具有n个结点的二叉树,采用二叉链表存储时,链表中指针域的总数为_________个,其中___________个用于链接孩子结点,_____________个空闲着。
13.2n,n-1,n+1
四、应用题
1.已知一棵树边的集合为{,,,,,,,,,,,,},请画出这棵树,并回答下列问题:
(1)哪个是根结点?
(2)哪些是叶子结点?
(3)哪个是结点g的双亲?
(4)哪些是结点g的祖先?
(5)哪些是结点g的孩子?
(6)哪些是结点e的孩子?
(7)哪些是结点e的兄弟?
哪些是结点f的兄弟?
(8)结点b和n的层次号分别是什么?
(9)树的深度是多少?
(10)以结点c为根的子树深度是多少?
1.解答:
根据给定的边确定的树如图5-15所示。
其中根结点为a;
叶子结点有:
d、m、n、j、k、f、l;
c是结点g的双亲;
a、c是结点g的祖先;
j、k是结点g的孩子;
m、n是结点e的子孙;
e是结点d的兄弟;
g、h是结点f的兄弟;
结点b和n的层次号分别是2和5;
树的深度为5。
4.已知用一维数组存放的一棵完全二叉树:
ABCDEFGHIJKL,写出该二叉树的先序、中序和后序遍历序列。
4.解答:
先序序列:
ABDHIEJKCFLG
中序序列:
HDIBJEKALFCG
后序序列:
HIDJKEBLFGCA
7.假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请写出该二叉树的后序遍历序列。
7.解答:
后序序列:
ACDBGJKIHFE
8.假设一棵二叉树的后序序列为DCEGBFHKJIA,中序序列为DCBGEAHFIJK,请写出该二叉树的后序遍历序列。
8.解答:
先序序列:
ABCDGEIHFJK
10.给定一组权值(5,9,11,2,7,16),试设计相应的哈夫曼树。
10.解答:
构造而成的哈夫曼树如图5-17所示。
第6章图
【例6-1】回答下列问题:
(1)具有n个顶点的连通图至少有多少条边?
(2)具有n个顶点的强连通图至少有多少条边?
这样的图应该是什么形状?
(3)具有n个顶点的有向无环图最多有多少条边?
解:
(1)具有n个顶点的连通图至少有n-1条边。
这是一个与生成树相关的问题。
生成树是一个连通图,它具有能够连通图中任何两个顶点的最小边集,任何一个生成树都具有n-1边。
因此,具有n个顶点的连通图至少有n-1条边。
(2)具有n个顶点的强连通图至少有n条边,这样的图是一个由n个顶点构成的环。
强连通图是相对于有向图而言的。
由于强连通图要求图中任何两个顶点之间能够相互连通,因此每个顶点至少要有一条以该顶点为弧头的弧和一条以该顶点为弧尾的弧,每个顶点的入度和出度至少各为1,即顶点的度至少为2,这样根据图的顶点数、边数以及各项点的度三者之间的关系计算可得:
边数=2×n/2=n。
(3)具有n个顶点的有向无环图最多有n×(n—1)/2条边。
这是一个拓扑排序相关的问题。
—个有向无环图至少可以排出一个拓扑序列,不妨设这n个顶点排成的拓扑序列为v1,v2,v3,…,vn,那么在这个序列中,每个顶点vi只可能与排在它后面的顶点之间存在着以vi为弧尾的弧,最多有n-i条,因此在整个图中最多有(n-1)+(n-2)+…+2+1=n×(n-1)/2条边。
2.图的存储结构
常用的存储结构有邻接矩阵和邻接表。
(1)邻接矩阵表示法
设G=(V,E)是有n(n≥1)个顶点的图。
则G的邻接矩阵是按如下定义的n阶方阵:
例如,图6-1中G1,G2的邻接矩阵分别表示为A1、A2,矩阵的行列号对应于图6-1中结点的序号。
由邻接矩阵的定义可知,无向图的邻接矩阵必定是对称阵;有向图的邻接矩阵不一定是对称的。
根据邻接矩阵,很容易判定任意两个顶点之间是否有边相连。
求各顶点的度也是非常容易的。
对于无向图,顶点Vi的度就是邻接矩阵中第i行(或第j列)上非零元的个数,即
。
对于有向图,第i行中非零元的个数为顶点Vi的出度,而第i列上的非零元个数为顶点Vi的入度。
(2)邻接表表示法
图的邻接链表存储结构是一种顺序分配和链式分配相结合的存储结构括两个部分:
一部分是向量,另一部分是链表。
邻接链表中的表头部分是向量,用来存储n个表头结点。
向量的下标指示顶点的序号。
例如,对于图6-1中G1和G2,其邻接链表如图6-3所