。( X ) 6.对有向图G,如果从任一顶点出发进行一次深度优先或广度优先搜索就能访问每个顶点,则该图一定是完全图。( X )7.\"二分查找法\"必需在有序表上进行。( V )
8.向二叉排序树中插入一个新结点时,新结点一定成为二叉排序树的一个叶子结点。( V ) 9.键值序列{A,C,D,B,E,E,F}是一个堆。( X )
10.在二路归并时,被归并的两个子序列中的关键字个数不一定相等。( V )
2
三、填空题(每空2分,共24分)
1.设r指向单链表最后一个结点,要在最后一个结点之后插入s所指的结点,需执行的三条语句是 r->next=s ; r=s; r->next=NULL 。
2.在带头结点单链表L中,表空的条件是 L->next==NULL
3.设一个链栈的栈顶指针为ls,栈中结点格式为 info│link ,栈空的条件是 ls==NULL 。若栈不空,则退栈操作为 p=ls; ls=ls->link ;free(p). 4.已知一棵度为3的树有2个度为1的结点,3个度为2的结点,4个度为3的结点,则该树中有 12 个叶子结点。
2
5.树有三种常用的存储结构,即孩子链表法,孩子兄弟链表法和 双亲表示法 。 6.n-1个顶点的连通图的生成树有 n-2 条边。
7.一个有向图G中若有弧、和,则在图G的拓朴序列中,顶点Vi,Vj和Vk的相对位置为 Vj->Vi->Vk 。8.设表中元素的初始状态是按键值递增的,分别用堆排序、快速排序、冒泡排序和归并排序 方法对其进行排序(按递增顺序), 冒泡排序 最省时间, 快速排序 最费时间。 9.下面是将键值为X的结点插入到二叉排序树中的算法,请在划线处填上适当的内容。 typedef struct node *pnode struct node { int key; pnode left,right; }
void searchinsert(int x; pnode t); //t为二叉排序树根结点的指针// { if( t=NULL )
{ p=malloc(size); p->key=x; p->left=nil; p->right=nil; t=p;} else if (xkey) searchinsert(x,t->left) else searchinsert(x,t-> right) ; }四、应用题(本题共28分)
1.给定权值{5,10,12,15,30,40},构造相应的哈夫曼树,要求写出构造步骤。(4分) 哈夫曼树构造步骤:
3
2.已知一表为(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec),按表中顺序依次插入初始为空的二叉排序树,要求:
(1)在右边画出建立的二叉排序树。(4分)
(2)求出在等概率情况下查找成功的平均查找长度。(2分) ASLSU =(1+2*2+3*3+4*3+5*2+6)/12=42/12=3.5
3.下图表示一个地区的交通网,顶点表示城市,边表示连结城市间的公路,边上的权表示修建公路花费的代价。怎样选择能够沟通每个城市且总造价最省的n-1条公路,画出所有可能的方案.(4分)
4.已知一个无向图的邻接表为:(本题4分,每小题2分)
(1)画出这个图。
(2)以V1为出发点,对图进行广度优先搜索,写出所有可能的访问序列。 V1->V2->V4->V5->V3 V1->V4->V2->V3->V5
4
5.设n个元素的有序表为R,K为一个给定的值,二分查找算法如下: int binsearch(sqlist R; keytype K:); {
l=1; h=n; suc=false; while (l<=h)&&(!suc) do { mid=(l+h)/2; case
K=R[mid].key: suc=true; KR[mid].key: l=mid+1 end }if (suc) return(mid) else return(0) }
将上述算法中划线语句改为:K若能正常工作,请给出一个查找序列和查找某个键值的比较次数.(本题4分) 答:(1)若K在R中或大于R中的最大值,则算法能正常运行;若K不在R中或小于R中的最大值,则算法不能正常运行,会出现死循环; (2)如:在[2,4,6,8]中,当K=7时,算法出现死循环; 当K=6时,算法能正常运行,查找成功,比较次数为2次。
6.有一组键值27,84,21,47,15,25,68,35,24,采用快速排序方法由小到大进行排序,请写出每趟的结果,并标明在第一趟排序过程中键值的移动情况。(本题共6分) 答:(1)每趟的结果:
(2)第一趟排序键值移动情况:
5
五、设计题(本题共14分)
1.一棵二叉树以二叉链表为存储结构 lchild│data│rchild 。设计一个算法,求在前序序列中处于第K个位置的结点。(本题6分)
类型定义如下:
typedef struct node * pointer ; struct node { datatype data ; pointer lchild, rchild ; }
typedef pointer bitreptr ; 算法如下:
void pre ( bitreptr t ; int k; bitreptr p ) { if ( t!=NULL ) { i=i+1;
if ( i==k){ p=t; return(p);}
pre(t->lchild, k,p ) ; pre(t->rchild, k,p ) ; } }
2.某单链表L的结点结构为 data│next ,结点个数至少3个,试画出该链表的结构图, 并编写算法判断该链表的元素是否成等差关系,即:设各元素值依次为a1,a2,...,an, 判断ai+1-ai=ai-ai-1是否成立,其中i满足2<=i<=n-1。(8分)
结构图: (略) 算法如下:
int dcsl(lklist L)
{ p=L; q=p->next; r=q->next; while ( r!= NULL)
if ((p->data)-(q->data) != (q->data)-(r->data)) return(0); else { p=q; q=r; r=r->next; } return(1); }
6