if(r[j]>r[j+1]){temp=r[j+1];r[j+1]=r[j];r[j]=temp;exchange=1;}
if(exchange==0)return;
33.中序遍历二叉排序树所得到的序列是有序序列(填有序或无序)。
34.快速排序的最坏时间复杂度为O(n2),平均时间复杂度为O(nlog2n)。
35.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,则该二叉树中度数为2的结点数为N0-1;若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有2N0+N1个空指针域。
1.36.设某无向图中顶点数和边数分别为n和e,所有顶点的度数之和为d,则e=d/2。
37.设一组初始记录关键字序列为(55,63,44,38,75,80,31,56),则利用筛选法建立
2.的初始堆为(31,38,54,56,75,80,55,63)。
3.38.设F和R分别表示顺序循环队列的头指针和尾指针,则判断该循环队列为空的条件为F==R。
39.下面程序段的功能是实现二分查找算法,请在下划线处填上正确的语句。
structrecord{intkey;intothers;};
intbisearch(structrecordr[],intk)
intlow=0,mid,high=n-1;
while(low<=high)
mid=(low+high)/2;
if(r[mid].key==k)return(mid+1);
elseif(r[mid].key>k)high=mid-1;elselow=mid+1;
return(0);
40.若顺序表每个元素长度均为5,其中第一个元素的存储地址为30,则第6个元素的存储地址为55。
41.栈的插入和删除只能在栈的栈顶进行,后进栈的元素必定先出栈,所以又把栈称为先进后出表;队列的插入和删除运算分别在队列的两端进行,先进队列的元素必定先出队列,所以又把队列称为先进先出表。
42.顺序表中逻辑上相邻的元素的物理位置必定紧邻。
单链表中逻辑上相邻的元素的物理位置不一定紧邻。
(对)
43.设一棵完全二叉树有128个结点,则该完全二叉树的深度为8,有64个叶子结点。
(对)
44.满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
(对)
45.设一棵二叉树的先序序列和后序序列,则能够唯一确定出该二叉树的形状。
(错)
46.栈和链表是两种不同的数据结构。
(错)
47.具有12个结点的完全二叉树有5个度为2的结点。
(对)
48.关键路径是事件结点网络中的从源点到汇点的最短路径。
(错)
49.由树转化成二叉树,该二叉树的右子树不一定为空。
(错)
50.堆排序是不稳定的排序方法。
(对)
51.调用一次深度优先遍历可以访问到图中的所有顶点。
(错)
52.分块查找的平均查找长度不仅与索引表的长度有关,而且与块的长度有关。
(对)
53.冒泡排序在初始关键字序列为逆序的情况下执行的交换次数最多。
(对)
54.已知一棵二叉树的先序序列是ABCDEFGHIJK,中序序列是CDBGFEAHJIK,请构造出该二叉树
55.设给定权集W={5,7,2,3,6,8,9},请构造画出关于W的一棵赫夫曼树,并求出其加权路径长度WPL。
加权路径长度:
WPL=2*4+3*4+5*3+6*3+7*3+8*2+9*2=108
56.对如下所示的带权图:
(1)分别按照克鲁斯卡尔算法和普里姆算法,从顶点v1出发,生成最小生成树,按生成次序依次写出各条边;
(2)画出该图最小生成树,并求出它的权值之和。
57、下图所示的森林:
(1)求树(a)的先根序列和后根序列;
(2)求森林先序序列和中序序列;
(3)将此森林转换为相应的二叉树;
(1)先根序列:
ABCDEF;后根序列:
BDEFCA;
(2)先序序列:
ABCDEFGHIJK;中序序列:
BDEFCAIJKHG
(3)森林转换为相应的二叉树;
58.设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出使用折半查找查找成功时的平均查找长度。
59.编写递归算法,计算二叉树中叶子结点的数目。
intLeafCount_BiTree(BitreeT)//求二叉树中叶子结点的数目
if(!
T)return0;//空树没有叶子
elseif(!
T->lchild&&!
T->rchild)return1;//叶子结点
elsereturnLeaf_Count(T->lchild)+Leaf_Count(T->rchild);//左子树的叶子数加
上右子树的叶子数
}//LeafCount_BiTree
61.假设正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’则不是回文。
试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。
intPalindrome_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0
{
InitStack(S);InitQueue(Q);
while((c=getchar())!
='@')
{
Push(S,c);EnQueue(Q,c);//同时使用栈和队列两种结构
}
while(!
StackEmpty(S))
{
Pop(S,a);DeQueue(Q,b));
if(a!
=b)returnERROR;
}
returnOK;
}//Palindrome_Test
62.设计两个有序单链表的合并排序算法。
voidmergelklist(lklist*ha,lklist*hb,lklist*&hc)
lklist*s=hc=0;
while(ha!
=0&&hb!
=0)
if(ha->datadata){if(s==0)hc=s=ha;else{s->next=ha;s=ha;};ha=ha->next;}
else{if(s==0)hc=s=hb;else{s->next=hb;s=hb;};hb=hb->next;}
if(ha==0)s->next=hb;elses->next=ha;
63.设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第4趟简单选择排序和第4趟直接插入排序后的结果。
(22,40,45,48,80,78),(40,45,48,80,22,78)
64.已知一棵二叉树的先序序列是ABCDEFGHIJK,中序序列是CDBGFEAHJIK,请构造出该二叉树
65.设一组有序的记录关键字序列为(13,18,24,35,47,50,62,83,90),查找方法用二分查找(折半查找),要求计算出查找关键字62时的比较次数并计算出查找成功时的平均查找长度。
2,ASL=91*1+2*2+3*4+4*2)=25/9
66、已知散列函数为H(key)=keymod7,散列表长度为7(散列地址空间为0.....6),待散列序列关键字依次为:
(25,48,32,50,68)。
要求
(1)根据以上条件构造一散列表,并用“线性探测再散列法”解决有关地址冲突(要求写出构造过程);
(2)若要用该散列表查找元素68,试给出所需的比较次数和依次被比较的关键字。
(1)散列表如图所示:
0123456
68
50
25
32
48
{H(25)=25mod7=4;没有地址冲突,故填入表中4号位置;
H(48)=48mod7=6;没有地址冲突,故填入表中6号位置;
H(32)=32mod7=4;出现地址冲突,使用线性探测:
H(32)=(4+1)mod7=5;
没有地址冲突,故填入表中5号位置;
H(50)=50mod7=1;没有地址冲突,故填入表中1号位置;
H(68)=68mod7=5;出现地址冲突,使用线性探测:
H(68)=(5+1)mod7=6;仍有地址冲突,故再次线性探测H(68)=(5+2)mod7=0;此时已没有地址冲突,故填入表中0号位置;
散列表全部构造完成!
}//以上为注释,供参考使用!
//
(2)共需要比较3次;依次分别和:
32,48,68进行比较。
68.已知一棵二叉树的中序序列:
CBEDAHGIJF,后序序列为:
CEDBHJIGFA,请画出该二叉树并写出其先序序列。
69.已知散列函数为H(key)=keymod7,散列表长度为7(散列地址空间为0.....6),待散列序列关键字为:
(32,55,39,57,75)。
要求:
(1)根据以上条件构造一散列表,并用“线性探测再散列法”解决有关地址冲突(要求写出构造过程);
(2)若要用该散列表查找元素75,试给出所需的比较次数和依次被比较的关键字。
①散列表如图所示:
32,55,39,57,75
0123456
75
57
39
32
55
{H(32)=32mod7=4;没有地址冲突,故填入表中4号位置;
H(55)=55mod7=6;没有地址冲突,故填入表中6号位置;
H(39)=39mod7=4;出现地址冲突,使用线性探测:
H(39)=(4+1)mod7=5;
没有地址冲突,故填入表中5号位置;
H(57)=57mod7=1;没有地址冲突,故填入表中1号位置;
H(75)=75mod7=5;出现地址冲突,使用线性探测:
H(75)=(5+1)mod7=6;仍有地址冲突,故再次线性探测H(75)=(5+2)mod7=0;此时已没有地址冲突,故填入表中0号位置;
散列表全部构造完成!
}//以上为注释,供参考使用!
//
②共需要比较3次。
依次分别和:
32,55,75进行比较。
70.希尔排序、简单选择排序、快速排序和堆排序是不稳定的排序方法,试举例说明。
【解答】
(1)希尔排序{512275275*061}增量为2
{275*061512275}增量为1
{061275*275512}
(2)直接选择排序{275275*512061}i=1
{061275*512275}i=2
{061275*512275}i=3
{061275*275512}
(3)快速排序{512275275*}
{275*275512}
(4)堆排序{275275*061170}已经是最大堆,交换275与170
{170275*061275}对前3个调整
{275*170061275}前3个最大堆,交换275*与061
{061170275*275}对前2个调整
{170061275*275}前2个最大堆,交换170与061
{061170275*275}
71.设给定一个权值集合W=(3,5,7,9,11),要求根据给定的权值集合构造一棵哈夫曼树并计算哈夫曼树的带权路径长度WPL。
73.设一组有序的记录关键字序列为(13,18,24,35,47,50,62,83,90),查找方法用二分查找(折半查找),要求计算出查找关键字62时的比较次数并计算出查找成功时的平均查找长度。
2,ASL=91*1+2*2+3*4+4*2)=25/9
74.已知二叉树的前序遍历序列是AEFBGCDHIKJ,中序遍历序列是EFAGBCHKIJD,画出此二叉树,并画出它的后序和中序线索二叉树。
后序线索二叉树如下图:
中序线索自己画
75.请画出下图的邻接矩阵和邻接表。
(1)邻接矩阵:
(2)邻接表:
78.设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出使用折半查找查找成功时的平均查找长度
ASL=(1*1+2*2+3*4)/7=17/7
79.已知一棵二叉树的中序序列:
CBEDAHGIJF,后序序列为:
CEDBHJIGFA,请画出该二叉树并写出其先序序列。
先序序列为:
ABCDEFGHIJ
80.设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第4趟简单选择排序和第4趟直接插入排序后的结果。
(22,40,45,48,80,78),(40,45,48,80,22,78)
81、编写算法实现将单链表就地逆置,即不另外开辟结点空间,而将链表元素翻转顺序。
思路:
从链上依次取下结点,按照逆序建表的方法重新建表。
voidReverse(LinkList&L)
p=L->next;//原链表
L->next=NULL;//新表(空表)
while(p){
//从原链表中取下结点s
s=p;
p=p->next;
//插入L新表表头
s->next=L->next;
L->next=s;
82、设计在链式结构上实现简单选择排序算法。
lklist*p,*q,*s;intmin,t;
if(head==0||head->next==0)return;
for(q=head;q!
=0;q=q->next)
min=q->data;s=q;
for(p=q->next;p!
=0;p=p->next)if(min>p->data){min=p->data;s=p;}
if(s!
=q){t=s->data;s->data=q->data;q->data=t;}
83.二叉树结点定义如下:
typedefstructBiTNode
{chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
请用递归的方法设计算法,先序、中序、后序遍历各结点输出结点值。
StatusPreorder(BiTreeT) (5分)
{//先序遍历二叉树
if(T){
visit(T->data);//访问结点
Inorder(T->lchild,visit);//遍历左子树
Inorder(T->rchild,visit);//遍历右子树
StatusInorder(BiTreeT) (5分)
{//中序遍历二叉树
if(T){
Inorder(T->lchild,visit);//遍历左子树
visit(T->data);//访问结点
Inorder(T->rchild,visit);//遍历右子树
StatusPostorder(BiTreeT) (5分)
{//后序遍历二叉树
if(T){
Inorder(T->lchild,visit);//遍历左子树
Inorder(T->rchild,visit);//遍历右子树
visit(T->data);//访问结点
供同学们练习用,考试以最后一次课讲课为主,如:
二叉排序树,练习题没有出,但考试是有的。
练习题中给出的答案,只供参考,因为很多题是没有标准答案的。
59.#include
usingnamespacestd;
typedefstructTNode//二叉树结构
{
charnodeValue;//结点的值
TNode*left;//左子树
TNode*right;//右子树
}*BiTree;
voidCreateBiTree(BiTree&T)//中序遍历方式创建二叉树