Exam 版 (精华区)

发信人: fenggao (kk), 信区: Exam
标  题: 2003年研究生入学试题数据结构答案(仅供参考)
发信站: 哈工大紫丁香 (Mon Dec 22 11:31:12 2003), 站内信件


2003年研究生入学试题数据结构答案(仅供参考)
一、填空:
1. 头指针
2. BFAWEH BFWAEH FBHAEW AFBWEH
3. K路归并、并行操作的缓冲处理、初始归并段
4. 最小
5. n-1 
6. 没有后继
二、单项选择与判断:
(一)1. A 2.D 3. D 4. A 
(二)5. 错误 6. 正确 7.正确 8.错误 9. 错误
三、简答题:
1. 堆与二元查找树均满足任一节点的元素值小于其左右儿子的值,但是若按中根顺序遍历
一颗二元查找树,将得到最终结果既递增顺序,而堆无此性质,需经过整理才得到最终结
果。
2. 用克鲁斯卡尔(Kruskal)算法较好。该算法假设G=(V,E)是一个具有n个顶点的连通
图,T=(V,TE)是G的最小生成树,U的初值等于V,即包含有G中的全部顶点,TE的初值
为空集。该算法的基本思想是:将G中的边按权值从小到大的顺序依次选取,若选取的边使
生成树T形成回路,则将其舍弃,如此进行下去,直到TE中包含n-1条边为止,此时的T即为
最小生成树。
3. 算法思想:由于栈的特点是先进后出,为了模拟先进先出的队列,必须用两个栈,一个
栈(S1)用于插入元素,另一个栈(S2)用于删除元素,每次删除元素时应将前一个栈的
所有元素读出然后进入第二个栈中,这样才能达到模拟队列的效果。
四、
int DELETE (HASH F, keytype W)
{   int locate;    int yes=0;
   locate=h(W);
   if (locate!=-1) 
   {   if (F[locate].key=W) 
      {   F[locate].key=deleted;
         yes=1;
      }
      else
         ERROR("出错");
   }
   return yes;
}
五、
设计思想:先对每个结点赋予一个层号, level域的最大值即为树的高度。
struct BTREE
{   
int LC;
   int RC;
   int LEVEL;
}; //树的抽象数据型
int level(BTREE T[maxsize])
{
   int i, count, LEVEL;
   count=LEVEL=-1;
  
   for(i=1;i<maxsize;i++)
   {
      if (T[i].LC>count) 
         count=T[i].LC;
      if (T[i].RC>count) 
         count=T[i].RC;
   } //得到这颗树共有多少个结点


   for(i=1;i<count;i++)
      T[i].level=0;

   T[1].LEVEL=1;
   for(i=1;i<count;i++)
   {
      if (T[i].LC!=0) 
         T[T[i].LC].level=T[i].level+1;
      if (T[i].RC!=0) 
         T[T[i].RC].level=T[i].level+1;
   }  //完成对每个结点赋予层号

  for(i=1;i<count;i++)
   {
      if (T[i].level>LEVEL) 
         LEVEL=T[i].level;
   } 
   return LEVEL; //返回树的高度
}

  
六、
设计思想:若存在这样的顶点,该顶点到其他任一结点都有一条有向路,又因为该有向图
是无环路的,那么该顶点到这些结点之间的路构成一个树,此树上的结点数应该等于该图
的结点数。若不等于(小于),则不存在这样的结点。因此,从任意结点开始,遍历此图
(先深、先广均可),若visited的结点数等于图的结点数,存在,否则不存在
设此有向图用邻接表表示,邻接表的抽象数据型如下所示:
      data firstarc  adjrex next

                  ……







struct node
{   int adjvex;
   node *next;
} //结点的型
struct g
{   vertexttype data;
   node *firstarc;
}typedef g ADJLIST; //邻接表的型

法一:广度优先遍历(使用队列)
int rbfs(ADJLIST g, int vi, vj)
{  int i, count ,yes; 
yes= 0; 
count =1;
QUEUE Q; 
   for(i=0;i<n;i++)
      visited[i]=0;
   ENQUEUE(vi,Q);
   visited[vi]=1; //初始化

   while(!EMPTY(Q)&&!yes)
   {   w=Q.front;
      p=g[w].firstarc;
      while((p!=NULL)&&!yes)
      {   w=p->adjdata;
         if(visited[w]=0)
         {   visited[w]=1;
        count++;
            ENQUEUE(w,Q);
         }
         else p=p->next;
      }
   }
if(count==V) //V为该有向图中结点总数
  yes=1;
   return yes;
}
法二:深度优先遍历(使用栈)
int rdfs(ADJLIST g,int vi,vj)
{  int i, count ,yes; 
yes= 0; 
count =1;
STACK S;
   for(i=0;i<n;i++)
      visited[i]=0;
   PUSH(vi,S);
   visited[vi]=1; //初始化

   while(!EMPTY(S)&&(yes==0))
   {   w=TOP(S);
      p=g[w].firstarc;
      while((p!=NULL)&&visited[p->adjdata])
      {   p=p->next;
         if(p==NULL) POP(S);
         else 
         {   w=p->adjdata;
            visited[w]=1;
count++;
            PUSH(w,S);
         }
      }
   }
if(count==V) //V为该有向图中结点总数
  yes=1;
   return yes;
}


--

※ 来源:.哈工大紫丁香 bbs.hit.edu.cn [FROM: 210.46.77.132]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.538毫秒