2005年北航硕士研究生入学考试"数据结构"试题与答案
2006-07-17 19:28
一、(本题10分)
若散列函数为H(key)=i MOD 7,其中,i为关键字key的第一个字母在英文字母表中的序号,并采用线性探测再散列法处理冲突。请画出在一个初始状态为空、地址域为[0‥6]的散列表中依次插入下列关键字值MON,TUE,WED,THU,FRI,SAT,SUN以后的散列表。 二、算法设计(本题10分) 所谓二叉树等价,是指它们不仅具有相同的拓扑结构,而且对应结点中包含相同的数据信息。假设二叉树采用二叉链表存储结构,链结点构造为(lchild data rchild),请写一递归算法,判断根结点指针分别为T1与T2的两棵二叉树是否等价。若它们等价,算法返回1,否则返回0。(说明:写成非递归算法不得分) 三、算法设计(本题10分) 已知一具有n个顶点的有向图G=(V,E)采用邻接表存储方法,请写一算法,检查任意给定序列v1,v2,…,vn(vi∈V,1≤i≤n)是否为该有向图的一个拓扑序列。若是,算法给出信息1,否则,给出信息0。 答案: 一、 0 1 2 3 4 5 6 TUE THU WED FRI SUN SAT MON 二、 int EQUAL(BTREE T1,BTREE T2) { if(!T1 && !T2) return 1; /* 两棵二叉树均为空 */ if(T1 && T2 && T1->data==T2->data /* 对应结点的数据相同 */ && EQUAL(T1->lchild,T2->lchild) /* 并且左子树等价 */ && EQUAL(T1->rchild,T2->rchild)) /* 并且右子树等价 */ return 1; return 0; /* 二叉树不等价 */ } 三、 int TOPOTEST(TOPOVLink G[],vertype V[],int n) { Elink *p; int i,k; for(i=0;i<n;i++){ for(k=0;k<n;k++){ if(G[k].vertex==V[i]){ /* 若顶点V[i]是G中的顶点 */ if(G[k].indegree!=0) /* 若顶点V[i]的入度不为0 */ return 0; /* 给定序列不是G的拓扑序列 */ p=G[k].link; /* 若顶点V[i]的入度为0 */ while(p!=NULL){ G[p->adjvex].indegree--; /* 相关顶点的入度减1 */ p=p->next; /* p移到下一个边结点 */ } break; /* 测试序列的下一个顶点 */ } } } return 1; /* 给定序列是G的拓扑序列 */ } |