发信人: caeser_zy(^*^金牛座BB仔) 
整理人: jasminwen(2003-04-13 18:16:55), 站内信件
 | 
 
 
 北京大学1997年研究生入学考试试题:数据结构
      
       
         
          
 1(16分)    填空
          
 ① 设只包含要根结点的二叉树的高度为0,则高度为k的二叉树的最大结点数为 ,最小结点数为 。
 
         
 ② 某二叉树结点的对称序序列为A,B,C,D,E,F,G,后序序列为B,D,C,A,F,G,E,则该二叉树结点的前序序列为 ,该二叉树对应的树林包括 
          棵树。
 
         
 ③ 求具有最小带权外部路径长度的扩充二叉树的算法称为 算法,对于给出的一组权W={10,12,16,21,30},通过该算法求出的扩充二叉树的带权外部路径长度为 
          。
 
         
 ④ 设有关键码序列(Q,H,C,Y,Q,A,M,S,R,D,F,X),要按照关键码值递增的次序进行排序,若采用初始步长为4的Shell排序法,则一趟扫描的结果是 
          ;若采用以第一个元素为分界元素的快速排序法,则一趟扫描的结果是 。
 
          
 2 (10分)
 
          
 请简要回答下列问题
 
         
 ① 什么是抽象数据类型?试举一例说明之。
 
         
 ② 什么是广义表?请简述广义表与线性表的主要区别。
 
          
 3 (6分)
 
          给定关键码序列(26,25,20,33,21,24,45,204,42,38,29,31),要用散列法进行存储,规定负载因子a=0.6。
 
          
 ① 请给出除余法的散列函数。
 
         
 ② 用开地址线性探查法解决碰撞,请画出插入所有的关键码后得到的散列表,并指出发生碰撞的次数。
 
          
 4 (6分)
 
          
 本题要求在检索各结点的概率不相等的条件下构造最佳二叉排序树。给出关键码集合 { B, E, H}
 
          key1 key2 key3
 
          以及权的序列
 
          ( 9 4 5 8 6 1 3)
 
          p1 p2 p3 q0 q1 q2 q3
 
          请构造最佳二叉排序树。
 
          
 5 (12分)
 
         
 ① 请画出往图1的5阶B-树中插入一个关键码390后得到的B-树,以及再删除关键码150后得到的B-树。
 
         
 ② 包括n个关键码的m阶B-树在一次检索中最多涉及多少个结点?(要求写出推导过程)
 
           
 
          
 
          
         
 图1 题5图
 
          
 6 (10分)
 
         
 如图2所示是一棵正在进行插入运算的AVL树,关键码70的插入使它失去了平衡,按照AVL树的插入方法,需要对它的结构进行调整以恢复平衡。 
          
 ①请画出调整后的AVL树。
 
         
 ②假设AVL树用llink-rlink法存储,T是指向根结点的指针、请用PASCAL(或C)语句表示出这个高速的过程。
 
          (说明:不必写出完整的程序,只需用几个语句表示出在本题所给的具体情况下调整过程中指针的变化。在调整过程中还有两个指针变量p和q可以使用)。
 
          
 
        
 图2 题6图
 
         
 7 (16分)
 
          
 请仔细阅读下面的堆排序算法。待排序记录存储在一维数组中,说明如下:
 
          TYPE node =RECORD
 
          key:integer;
 
          info:datatype
 
          END
 
          heaptype = ARRAY [1..n0] OF node;
 
         
 过程heapsort的功能是将数组heap中的前n个记录按关键码值递减的次序排序。heapsort调用sift,sift的参数heap,h和r具有如下的含义:调用sift时,以heap[h+1],heap[h+2],……,heap[r/2]为根的子树已经是堆;sift执行后,以heap[h],heap[h+1],heap[h+2],……heap[r/2]为根的子树都成为堆。
 
          PROCEDURE sift (VAR heap:heaptype; h,r:integer);
 
          VAR i,j:integer;
 
          x:node;
 
          finish:boolean;
 
          BEGIN
 
          i:=h;
 
          x:=heap[i];
 
          j=2*i;
 
          finish:=false
 
          ;
 
          WHILE DO
 
          BEGIN
 
          IF(jheap[j+1].key)
 
          THEN j:=j+1;
 
          IF x.key > heap[j].key
 
          THEN BEGIN
 
          
 
          END
 
          ELSE finish:=true;
 
          END;
 
          
 
          END;
 
          PROCEDURE heapsort (VAR heap:heaptype; n:integer);
 
          VAR h,r,i,j:integer;
 
          x:node;
 
          BEGIN
 
          FOR h:=n DIV 2 DOWNTO 1 DO
 
          
 
          FOR r:=n DOWNTO 2 DO
 
          BEGIN
 
          x:=heap[1];
 
          heap[1]:=heap[r];
 
          heap[r]:=x;
 
          
 
          END
 
          END;
 
         
 ① 请在sift过程和heapsort过程的空缺处填入适当内容,使它们能正确工作。
 
         
 ② 若调用heapsort的参数值n=10,那么在heapsort的执行过程中sift过程被调用了多少次?
 
         
 8 (24分)
 
         
 试设计一个算法解决地图着色判断问题。 设一幅地图有n个区域(例如,省)。用不多于4种颜色对这些区域进行着色,着色应满足的要求是相邻的区域具有不同的颜色。你的算法以一种着色方案(即哪一个区域着什么颜色)为输入,算法对该着色方案进行考察,若满足着色要求,则输出true,否则输出false。
 
         
 ① 用自然语言和PASCAL(或C)语言描述你为解决问题而设计的数据结构(逻辑结构,存储结构)。数据结构的设计应考虑对问题的清楚描述和算法的效率。
 
         
 ② 用类PASCAL(或C)语言写出你的算法。算法应简洁、高效。对算法中的参数、变量、语句做必要的注释,以增加可读性。
 
         
 ③ 简单分析你的算法的空间开销和时间开销。
 
  
 
  
  
 
  ----
         | 
 
 
 |