for(inti=1;i<=n;i++){cin>>x;if(x%2)Enqueue(q1,x);elseEnqueue(q2,x);}
}
习题4-3算法设计
1.写出采用递归方法求1~n之间所有整数的平方和的算法。
2.采用递归方法把任一十进制正整数转换为S进制(2≤S≤9)数输出。
3.采用辗转相除法和递归的方法求出两个正整数的最大公约数。
4.采用递归方法求两个正整数的最小公倍数。
5.裴波那契(Fibonacci)数列的定义为:
它的第1项和第2项为0和1,以后各项为其前两项之和。
若裴波那契数列中的第n项用Fib(n)表示,则计算公式为:
Fib(n)=
试编写计算Fib(n)的递归算法和非递归算法,并分析它们的时间复杂度和空间复杂度。
习题5-1运算题
1.已知一棵度为m的树中有n
个度为1的结点,n
个度为2的结点,…,n
个度为m的结点,问树中有多少个叶子结点?
2.画出由三个结点a、b、c组成的所有不同结构的二叉树,则共有多少种不同的结构?
每一种结构又对应多少种不同的值的排列次序?
3.设一棵二叉树广义表表示为a(b(c),d(e,f)),分别写出对它进行先序、中序、后序、按层遍历的结果。
4.设一棵二叉树的广义表表示为a(b(,e),c(f(h,i),d))分别写出对它进行先序、中序、后序、按层遍历的结果。
5.已知一棵二叉树的先根和中根序列,求该二叉树的后根序列。
先根序列:
A,B,C,D,E,F,G,H,I,J
中根序列:
C,B,A,E,F,D,I,H,J,G
后根序列:
6.已知一棵二叉树中根和后根序列,求出该二叉树的高度和双支、单支和叶子节点数。
中根序列:
c,b,d,e,a,g,i,h,j,f
后根序列:
c,e,d,b,i,j,h,g,f,a
习题5-2
1.下面函数的功能是返回二叉树BT中值为X的节点所在层号,请在划有横线的地方填写合适的内容。
intNodelevel(BTreeNode*BT,ElemTypex)
{
if(BT==NULL)return0;
elseif(BT->data==X)return1;
else{
intc1=Nodelevel(BT->left,X);
if(c1>=1)_________________;
intc2=___________________;
if________________________;
//若树中不存在X节点则返回0
return0;
}
}
2.指出下面函数的功能。
BTreeNode*BTreeSwapX(BTreeNode*BT)
{
if(BT==NULL)returnNULL:
else{
BTreeNode*pt=newBTreeNode;
pt->data=BT->data;
pt->right=BTreeSwapX(BT->left);
pt->left=BTreeSwapX(BT->right);
returnpt;
}
}
3.已知二叉树中的节点类型StreeNode定义如下。
structStreeNode(datatypedata;STreeNode*lchild,*rchild,*parent;);
其中,data为节点值域,lchild和rchild分别为指向左、右孩子节点的指针域,parent为指向父亲节点的指针域。
根据下面函数的定义指出函数的功能。
算法中的参数ST指向一颗二叉树,X保存一个节点的值。
STreeNode*PN(STreeNode*ST,datatype&X)
{
if(ST==NULL)returnNULL;
else{
StreeNode*mt;
if(ST->dat==x)returnST->parent;
elseif(mt=PN(ST->lchild,X))returnmt;
elseif(mt=PN(ST->rchild,X))returnmt;
returnNULL;
}
}
4.指出下面函数的功能。
voidBTC(BTreeNode*BT)
{
if(BT!
=NULL){
if(BT->left!
=NULL&&BT->right!
=NULL)
if(BT->left->data>BT->right->data){
BTreeNode*t=BT->left;
BT->left=BT->right;
BT-right=t;
}
BTC(BT->left);
BTC(BT->right);
}
}
5.设BT指向一棵二叉树,该二叉树的广义表表示为a(b(a,d(f)),c(e(,a(k)),b)),则依次使用BTC(BT,’a’,C)、BTC(BT,’b’,C)、BTC(BT,’c’,C)、BTC(BT,’g’,C)、调用下面算法时,假定每次调用时C的初值均为0,引用变量带回值依次为______、______、______、______。
voidBTC(BTreeNode*BT,charx,int&k)
{if(BT!
=NULL){
if(BT->data==x)k++;
BTC(BT->left,x,k);
BTC(BT->right,x,k);
}
}
6.下面函数功能
voidpreserve(BTreeNode*BT,ElemTypea[],intn)
{staticinti=0;
if(BT!
=NULL){preserve(BT->left,a,n);a[i++]=BT->data;
preserve(BT->right,a,n);}
}
习题5-3算法设计题
1.根据下面函数声明编写求一棵二叉树BT中结点总数的算法,其值由函数返回。
intBTreeCount(BTreeNode*BT);
2.根据下面函数声明编写求一棵二叉树中叶节点总数的算法,其值由函数返回。
intBTreeLeafCount(BTreeNode*BT);
3.写出对二叉树进行中序遍历的非递归算法。
习题6-1运算题
1.已知一组元素为(46,25,78,62,12,37,70,29),画出按元素排列顺序输入生成一颗二叉搜索树,再以广义表形式给出该二叉搜索树。
2.已知一颗二叉搜索树的广义表表示尾28(12(,16),49(34(30),72(63))),若从中依次删除72、12、49、28等4个节点,拭分别画出每删除一个节点后得到图形表示的二叉搜索树,并写出对应的广义表表示。
3.从空堆开始依次向小根堆中插入集合{38,64,52,15,73,40,48,55}中的每个元素,试以顺序表的形式给出每插入一个元素后堆的状态。
4.已知一个堆为(12,15,40,38,26,52,48,64),若从堆中依次删除4个元素,请给出每删除一个元素后堆的状态。
5.有七个带权结点,其权值分别为3、7、8、2、6、10、14,试以它们为叶子结点构造一棵哈夫曼树,给出其广义表表示,并计算出带权路径长度WPL。
6.在一份电文中共使用五种字符:
a、b、c、d、e,它们的出现频率依次为4、7、5、2、9,试画出对应的编码哈夫曼树,求出每个字符的哈夫曼编码,并求出传送电文的总长度
7.一组关键字为(40,28,16,56,50,32,30,63),试依次插入节点生成一颗平衡二叉搜索树,并标明插入时所需平衡的类型。
8.一组关键字为(36,75,83,54,12,67,60,40,92,72),试依次插入节点分别生成一颗二叉搜索树和二叉平衡树,并分别求查找每个元素的平均查找长度。
习题6-2算法设计题
1.写出对二叉树进行中序遍历的非递归算法。
2.编写一个非递归算法求出二叉排序树中的关键字最大的元素。
习题7-1运算题
1.对于图7-30(a)和图7-30(b),求出:
(1)每一个图的二元组表示,对于带权图,可将边的权写在该边的后面;
(2)在图7-30(a)中每个顶点的度,以及每个顶点的所有邻接点和所有边;
(3)在图7-30(b)中每个顶点的入度、出度和度,以及每个顶点的所有入边的出边;
(4)在图7-30(a)中从v
到v
的所有简单路径及相应路径长度;
在图7-30(b)中从v
到v
的所有简单路径及相应带权路径长度。
4081
134
0272
92
13354
(a)(b)
图7-30
2.对于图7-30(a)和图7-30(b),画出:
(1)每个图的邻接矩阵;
(2)每个图的邻接表;
(3)7-30(b)的逆邻接表和十字邻接表;
(4)每个图的边集数组。
3.对于图7-31(a)和图7-31(b),按下列条件试分别写出从顶点v
出发按深度优先搜索遍历得到的顶点序列和按广度优先搜索遍历得到的顶点序列。
(1)假定它们均采用邻接矩阵表示;
(2)假定它们均采用邻接表表示,并且假定每个顶点邻接表中的结点是按顶点序号从大到小的次序链接的。
0012
1654
79345
8
678
2(a)3(b)
图7-31
4.已知一个图的二元组表示如下:
V={0,1,2,3,4,5,6,7,8}
E={(0,3),(0,4),(1,2),(1,4),(2,4),(2,5),(3,6),(3,7),(4,7),(5,8),(6,7),(7,8)}
(1)画出对应的图形。
(2)假定从定点0出发,给出邻接矩阵表示的图的深度优先和广度优先搜索遍历的顶点序列。
(3)假定从定点0出发,给出邻接表表示的图的深度优先和广度优先搜索遍历的顶点序列,假定每个顶点邻接表中的节点都是按顶点序号从大到小的次序链接的。
习题8-1运算题。
1.对于图8-32,做:
(1)画出最小生成树并求出它的权;
(2)从顶点v
出发,按照普里姆算法并入最小生成树中各边的次序写出各条边;
(3)按照克鲁斯卡算法并入最小生成树中各边的次序写出各条边。
0125031152
681513956897
1461648334612
12920101012
58
253546207
7
图8-32图8-33
2.对于图8-33,利用狄克斯特拉算法求出从顶点v
到其余各顶点的最短路径,并画出对应的图形表示。
3.已知一个图的二元组表示为:
V={0,1,2,3,4,5,6,7}
E={(0,1)8,(0,3)2,(0,5)10,(1,2)6,(1,4)20,(1,6)12,(2,4)10,(2,7)15,(3,5)5,(3,6)7,(4,7)4,(5,6)6,(6,7)8}
(1)按照克鲁斯卡尔算法求最小生成树,写出依次得到的各条边。
(2)按照狄克斯特拉斯算法求从顶点0到其余各顶点的最短路径。
4.对于图8-34,利用弗洛伊德算法求出每对顶点之间的最短路径,即仿照图8-8的运算过程,给出从邻接矩阵出发每加入一个中间点后矩阵的状态。
5.对于图8-35,试给出一种拓扑序列,若在它的邻接表存储结构中,每个顶点邻接表中的边结点都是按照结点序号从大到小链接的,则按此给出唯一一种拓扑序列。
22
072057
434196
39
183168
44
图8-34图8-35
6.一个AOV网的二元组表示为:
V={0,1,2,3,4,5,6,7,8,9,10}
E={<0,2>,<0,4>,<1,2>,<1,5>,<2,4>,<3,5>,<4,6>,<4,7>,<5,7>,<6,8>,<7,6>,<7,8>,<7,9>,<8,10>,<9,10>}
在此AOV网的邻接表存储中,若各顶点邻接表中的边节点是按照邻接顶点序号从大到小链接的,请写出按此邻接表和介绍的拓扑排序算法得到的拓扑序列。
提示:
先画出图形再运算。
7.对于图8-36所示的AOE网,求出:
1.每个事件的最早发生时间和最迟发生时间;
2.完成整个工程至少需要多长时间;
3.每项活动的最早开始时间和最迟开始时间以及开始时间余量;
4.画出由所有关键活动所构成的图;
5.哪些活动加速可使整个工程提前完成。
135
0689
247
图8-36