1、数据结构期末试题 答案2009-01-09 08:17一、 单选题:判断下列各小题叙述的正误。对,在题号前的括号内填入“”;错,在题号前的括号内填入“”。(每小题 3 分,共 24 分) (1)向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。A 8 B 63.5 C 63 D 7 (2)设有一个二元数组 Amn,假设 A00存放位置在 644(10),A22存放位置在 676 (10),每个元素占一个空间,则 A45在( )位置,(10)表明用 10 进数表示。 A 692(10) B 626(10) C 709(10) D 724(10) (3)一
2、个有顺序表有 255 个对象,采用顺序搜索法查表,平均搜索长度为( ) A 128 B 127 C 126 D 255 (4)含 5 个节点(元素值均不相同)的二叉搜索树有( )种 A 54 B 42 C 36 D 65 (5)在分析折半搜索的性能时常加入失败结点,即外结点,从而形成扩充的二叉树。若设失败结点i 所在层为 l,那么搜索失败到达失败结点时所做的数据比较次数是( )。 A li+1 B li+2 C li-1 D li (6)设有一个含 200 个表项的散列表,用线性探查法解决冲突,按关键码查询时找到一个表项的平均探查次数不超过 1.5,则散列存储空间应能够至少容纳( )个表项。(
3、搜索成功的平均搜索长度为 Snl=(1+1/(1-a)/2,其中 a 为装填因子 A 400 B 526 C 624 D 676 (7)n 个顶点的连通图至少有( )条边 A n-1 B n C n+1 D0 (8)一个二叉树按顺序方式存储在一个一维数组中,如图则结点 E 在二叉树的第( )层。 A 1 B 2 C 3 D 4 二、阅读理解题:说明下面递归过程的功能(10分) int unknown (BinTreeNode * t) /指针 t 是二叉树的跟指针。 if (t=NULL) return 0; elseif (t-leftChild=NULLt-rightChild=NULL)
4、return 1; else return unknown (t-leftChild)+unknown (t-rightChild); 三、简答题(每小题 12 分,共 36 分) 1.如下所示的连通图,请画出 (1)以顶点为根的深度优先生成树;(6 分) (2)如果有关节点,请找出所有的关节点。(6分)2、设有 13 个初始归并段,其长度分别为28,16,37,42,5,9,13,14,20,17,30,12,18。试画出 4 路归并时的最佳归并树,并计算它的带权路径长度 WPL。 3、设散列表 HT012,即表的大小为 m=13。采用双散列法解决冲突。散列函数和再散列函数分别为: H0(k
5、ey)=key % 13; 注:%是求余数运算(=mod) Hi=(hi-1+REV (key+1) % 11+1)%13; i=1,2,3,.,m-1 其中,函数 REV(x)表示颠倒 10 进制数 x 的各位,如 REV(37)=73 REV(7)=7 等。若插入的关键码序列为2,8,31,20,19,18,53,27。试画出插入这 8 个关键码后的散列表。四、(10 分) 已知一棵二叉树如下,请分别写出按前序、中序、后序和层次遍历时得到的结点序列。五、综合算法题(10)分 有一种简单的排序算法,叫做记数排序(count Sorting)。这种排序算法对一个待排序的表(用数组表示)进行排序
6、,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键码互不相同。记数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小。假设针对某一个记录,统计出的记数值为 c,那么,这个记录在新的有序表中的合适的存放位置即为 c。 (1)给出适用于记数排序的数据表定义;(4 分) (2)使用 C+语言编写实现记数排序的算法;(4 分)(3)对于有 n 个记录的表,关键码比较次数是多少?(2 分)六、程序填空题(10 分) 下面给出的是一个在二叉树中查找值为 x 的结点,并打印该结点所有祖先结点的算法。在此算法中,假设值为 x 的结点不多于一个。此
7、算法采用后序的非递归遍历形式。因退栈时需要区分其左、右子树是否已经遍历,故在结点进栈时附带有一个标志,=0,进入左子树,=1,进入右子树。用栈ST 保存结点指针 ptr 以及标志 tag。top 是栈顶指针。 void print (BintreeNode * t; Type x) stack ST; int i, top; top=0; /置空栈 while (t ! =NULLt-data ! =x ll top ! =0) while (t ! =NULLt-data ! =x) /寻找值为 x 的结点 1_; STtop.ptr=t; /进栈 STtop.tag=0; 2_; if (
8、t! =NULLt-data=x) /找到值为 x 的结点 for (i=1; 3_;i+) cout ST.ptr-data endl; else while (top 0STtop.tag=1) /未找到值为 x 的结点 top-; if (top 0) ST top.tag=1; /转向右子树 4_; /*print*/ (1)请将缺失的语句补上(共 4 分,每空 1 分)(2)请给出对于右图所示的二叉树,使用上述算法搜索值为 9 的结点和值为 10 的结点的结果,以及在栈 ST 中的变化。(top 是栈顶指针) (6 分) 试题答案 试题 一、(1) B (2) C (3) A (4)
9、 B (5) D (6) A (7) A (8) B 二、计算二叉树的叶结点个数。 三、1. (1)该连通图从出发做深度优先搜索,得到的深度优先生成树为:(2)关节点为 2.因为(13-1)%(4-1)=12%3=0,所以不需要添加空段。最佳归并树为WPS=(5+9+13+12+16+14+17+18+28+37+20+30)*2+42=480 3.散列表 HT012,散列函数与再散列函数为 H0(key)=key mod 13; Hi=(Hi-1+REV(key+1) mod 11+1) mod 13 插入关键码序列为2,8,31,20,19,18,53,27 H0(2)=2,比较次数为 1
10、 H0(8)=8,比较次数为 1 H0(31)=5,比较次数为 1 H0(20)=7,比较次数为1 H0(19)=6,比较次数为 1 H0(18)=5,冲突,H1=9,比较次数为 2 H0(53)=1,比较次数为 1 H0(27)=1,冲突,H1=7,冲突 H2=0,比较次数为 3 插入 8 个关键码后的散列表四、 前序:A,B,D,G,C,E,F,H 中序:D,G,B,A,E,C,H,F 后序:G,D,B,E,H,F,C,A 层次:A,B,C,D,E,F,G,H五、(1) const int DefaultSize=100; template class Type class datalis
11、t; /数据表的前视声明 template class Type class Element /数据表无元素类的定义 private: Type key; /关键码 field otherdata; /其它数据成员 public: Type getKey ( ) return key; /取当前结点的关键码 void setKey (const Type x) key=x; /将当前结点的关键码修改为 x template class Type class datalist /用顺序表来存储待排序的元素,这些元素的类型是 Type public: datalist (int MaxSz=Def
12、aultSize) : MaxSize (Maxsz),CurrentSize (0) Vector=new Element Type MaxSz; private: Element Type * Vector; /存储待排序元素的向量 int MaxSize,CurrentSize; /最大元素个数与当前元素个数 (2)解答 1 template class Type void countsort (datalist Type initList,datalist Type resultList) int i,j,c; Type refer; for (i=0; iinitList,Curre
13、ntSize; i+) c=0; refer :=initList.Vector.getKey ( ); for (j=0; jinitList.CurrentSize; j+) if (initList.Vectorj.getKey ( )refer) c+, resultList.Vectorc=initList.Vector resultList.CurrentSize=initList.CurrentSize; 解答 2 template class Type void countsort (datalistType initList int *c=new intinitList.Cu
14、rrentSize; for (int i=0; iinitList.CurrentSize; i+) c=0; for (i=0; iinitList.CurrentSize-1; i+) for (int j=i+1; jinitList.CurrentSize; j+) if (initList.Vectorj.getKey( )initList.Vector.getKey( )c+; else cj+; for (i=0; iinitList.CurrentSize; i+) resultList.Vectorc=initList.Vector; resultList.CurrentS
15、ize=initList.CurrentSize; (3)解答一 关键码比较次数为 解答二 关键码比较次数为六、(1) top+ t=t-leftChild i=top t=STtop.ptr-rightChild (2)搜索值为 9 的结点ptr tag ptr tag 搜索值为 10 的结点ptr tag ptr tag ptr tag ptr tag ptr tag ptr tagptr tag ptr tag ptr tag ptr tag ptr tag一、单选题 从供选择的答案中选出正确的答案,将其编号填入括号中。 1. 在数据结构的讨论中把数据结构从逻辑上分为( )。 A内部结构
16、与外部结构 B. 静态结构与动态结构 C. 线性结构与非线性结构 D. 紧凑结构与非紧凑结构 2. 采用线性链表表示一个向量时,要求占用的存储空间地址( )。 A. 必须是连续的 B. 部分地址必须是连续的 C. 一定是不连续的 D. 可连续可不连续 3. 采用顺序搜索方法查找长度为 n 的顺序表时,搜索成功的平均搜索长度为( )。 A. n B. n/2 C. (n-1)/2 D. (n+1)/2 4. 在一个单链表中,若 q 结点是 p 结点的前驱结点,若在 q 与 p 之间插入结点 s,则执行( )。 A. slink = plink; plink = s; B. plink = s;
17、slink = q; C. plink = slink; slink = p; D. qlink = s; slink = p; 5. 如果想在 4092 个数据中只需要选择其中最小的 10 个,采用( )方法最好。 A. 起泡排序 B. 堆排序 C. 直接选择排序 D. 快速排序 6. 设有两个串 t 和 p,求 p 在 t 中首次出现的位置的运算叫做( )。 A. 求子串 B. 模式匹配 C. 串替换 D. 串连接 7. 在数组 A 中,每一个数组元素 Ai, j 占用 3个存储字,行下标 i 从 1 到 8,列下标 j 从 1 到10。所有数组元素相继存放于一个连续的存储空间中,则存放该
18、数组至少需要的存储字数是( )。A. 80 B. 100 C. 240 D. 270 8. 将一个递归算法改为对应的非递归算法时,通常需要使用( )。 A. 栈 B. 队列 C. 循环队列 D. 优先队列 9. 一个队列的进队列顺序是 1, 2, 3, 4,则出队列顺序为( )。 A. 4, 3, 2, 1 B. 2, 4, 3, 1 C. 1, 2, 3, 4 D. 3, 2, 1, 4 10. 在循环队列中用数组 A0m-1 存放队列元素,其队头和队尾指针分别为 front 和 rear,则当前队列中的元素个数是( )。 A. (front - rear + 1) % m B. (rear
19、 - front + 1) % m C. (front - rear + m) % m D. (rear - front + m) % m二、判断题 判断下列各个叙述的正误。对,在题号前的括号内填入“?“;错,在题号前的括号内填入“?“。 ( ) 1. 算法的运行时间涉及加、减、乘、除、转移、存、取等基本运算。要想准确地计算总运算时间是不可行的。 ( ) 2. 二维数组是数组元素为一维数组的线性表,因此二维数组元素之间是线性结构。 ( ) 3. 顺序表用一维数组作为存储结构,因此顺序表是一维数组。 ( ) 4. 通常使用两个类来协同表示单链表,即链表的结点类和链表类。 ( ) 5. 栈和队列都
20、是顺序存取的线性表,但它们对存取位置的限制不同。 ( ) 6. 在使用后缀表示实现计算器类时用到一个栈类的实例,其作用是暂存运算对象。 ( ) 7. 具有 n 个结点的完全二叉树的高度为 ?log2 n? +1。(n ? 0, 根在第 0 层) ( ) 8. 为度量一个搜索算法的效率,需要在时间和空间两个方面进行分析。 ( ) 9. 闭散列法通常比开散列法时间效率更高。 ( ) 10. 一棵 m 阶 B 树中每个结点最多有 m 个关键码,最少有 2 个关键码。三、填空题 把合适的内容添到横线上。 1. 对于一个单链接存储的线性表,假定表头指针指向链表的第一个结点,则在表头插入结点的时间复杂度为
21、_,在表尾插入结点的时间复杂度为_。 2. 假定一棵三叉树(即度为 3 的树)的结点个数为 50,则它的最小高度为_,假定树根结点为第 0 层。 3一棵高度(假定树根结点为第 0 层)为 4 的完全二叉树中的结点数最少为_个,最多为_个。 4. 在一个具有 n 个顶点的无向图中,要连通所有顶点则至少需要_条边。 5从有序表(12,18,30,43,56,78,82,95)中分别折半查找 43 和 56 元素时,其查找长度分别为_和_。 6对一棵二叉搜索树进行中序遍历时,得到的结点序列是一个_。 7. 在开散列表中,处理冲突的方法为_法,在闭散列表中,处理冲突的方法为_法。 8在堆排序的过程中,
22、对任一分支结点进行筛运算(即调整为子堆的过程)的时间复杂度为_,整个堆排序过程的时间复杂度为_。 9. 快速排序在平均情况下的时间复杂度为_,在最坏情况下的时间复杂度为_。 10在二路归并排序中,对 n 个记录进行归并的趟数为_。四、运算题 1. 假定一棵普通树的广义表表示为 a(b(e),c(f(h,i,j),g),d), 分别写出先根、后根、按层遍历的结果。 先根: 后根: 按层: 2若一个图的边集为(A,B),(A,C),(A,D),(B,D),(C,F),(D,E),(D,F),从顶点 A 开始分别对该图进行深度优先搜索和广度优先搜索,要求顶点值小的邻接点被优先访问,则写出得到的深度优
23、先搜索和广度优先搜索的顶点序列。 深度优先搜索得到的顶点序列: 广度优先搜索得到的顶点序列:3已知一个二叉搜索树的广义表表示为38(25(16),52(,74(68(,72),90),在下表中填写出每个元素的比较次数。 1 2 3 4 5 6 7 8 38 25 52 16 74 68 90 724. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,46,18,70),散列地址空间为 HT13,若采用除留余数法构造散列函数和线性探测法处理冲突,试求出每一元素在闭散列表中的初始散列地址和最终散列地址,画出最后得到的散列表,求出平均查找长度。 1 2 3 4 5 6 7 8
24、 9 10 元素 32 75 29 63 48 94 25 46 18 70 初始散列地址 最终散列地址0 1 2 3 4 5 6 7 8 9 10 11 12 散列表平均查找长度:5. 已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用快速排序法进行排序时每一趟的排序结果。五、算法分析题 1给出下列每个递归过程的执行结果。 (1) void unknown(int w) if(w) unknown(w-1); for(int i=1; i=w; i+) coutw; coutendl; 调用语句为 unknown (4)。(2) void unknown(
25、int n) coutn%10; if(n/10) unknown(n/10); 调用语句为 unknown ( 582 )。(3) int unknown ( int m ) int value; if ( ! m ) value = 3; else value = unknown ( m-1 ) + 5; return value; 执行语句为 cout unknown (3)。2. 填空。设有一个带表头结点的双向链表 L,每个结点有 4 个数据成员:指向前驱结点的指针prior、指向后继结点的指针 next、存放数据的成员 data 和访问频度 freq。所有结点的 freq 初始时都为
26、 0。每当在链表上进行一次 L.Locate(x)操作时,令元素值为 x 的结点的访问频度 freq 加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。 函数中有些语句缺失,请将它们补上。 template class Type void DblListType : Locate ( Type x ) /查找 x 结点 DblNodeType *p = first-next; while ( p != first ) p = p-next; if ( p != first ) /链表中存在 x ; /该结点
27、的访问频度加 1 DblNodeType *current = p; /从链表中摘下这个结点 current-prior-next = current-next; current-next-prior = current-prior; p = current-prior; /寻找重新插入的位置 while ( p != first ) p = p-prior; current-next = ; /插入在 p 之后 current-prior = p; p-next-prior = current; p-next = ; else cout“Sorry. Not find!n“; /没找到 缺失
28、的语句为: 3. 假定 btnode 为二叉树中的结点类型,它含有数值域 data、左指针域 lchild 和右指针域rchild,下面函数中的参数 BT 指向一棵二叉树的树根结点,X 为给定元素,请给出该函数的功能。 btnode* AAA(btnode* BT, datatype X) if(BT=NULL) return NULL; else if(BT-data=X) return BT; /返回值为 X结点的指针 else btnode* mt; if(mt=AAA(BT-lchild,X) return mt; else if(mt=AAA(BT-rchild,X) return
29、mt; else return NULL; 六、算法设计题 1设计一个算法,从树根指针为 rbitreptr 的二叉树中删除结点值为 x 的子树,若删除成功则返回 1,否则返回 0。假定在算法中不要求回收被删除子树中的所有街道,算法中的 bitreptr 为结点指针类型,所指结点类型包含三个域,即值域data,左指针域 lchild 和右指针域 rchild。 int deleteSubtree(bitreptr r, datatype x);2. 已知二叉搜索树中的结点类型用 BtreeNode 表示,被定义为: struct BtreeNode ElemType data; BtreeNo
30、de *left, *right; 其中 data 为结点值域,left 和 right 分别为指向左、右孩子结点的指针域。假定具有 BtreeNode*类型的指针参数 BST 指向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个非递归算法,向 BST 树中插入值为 item 的结点,若树中不存在item 结点则进行插入并返回 1 表示插入成功,若树中已存在 item 结点则不插入并返回 0 表示插入失败。 int Insert(BTreeNode* BST, const ElemType item); 参考解答 一、单选题: 1. C 2. D 3. D 4. D 5. B 6. B 7
31、. C 8. A 9. C 10. D 二、判断题 1. ? 2. ? 3. ? 4. ? 5. ? 6. ? 7. ? 8. ? 9. ? 10. ? 三、填空题 1. O(1) O(n) 24 316 31 4. n-1 5. 1 3 6. 有序序列 7. 链接 开放定址 8O(log2n) O(nlog2n) 9O(nlog2n) O(n2) 10?log2n?四、运算题 1. 先根:a,b,e,c,f,h,i,j,g,d; 后根:e,b,h,i,j,f,g,c,d,a; 按层:a,b,c,d,e,f,g,h,i,j 2. 深度优先搜索得到的顶点序列:A,B,D,E,F,C 广度优先搜索
32、得到的顶点序列:A,B,C,D,F,E31 2 3 4 5 6 7 8 38 25 52 16 74 68 90 72 1 2 2 3 3 4 4 54平均查找长度为 14/10。 1 2 3 4 5 6 7 8 9 10 元素 32 75 29 63 48 94 25 46 18 70 初始散列地址 6 10 3 11 9 3 12 7 5 5 最终散列地址 6 10 3 11 9 4 12 7 5 80 1 2 3 4 5 6 7 8 9 10 11 12 散列表 29 94 18 32 46 70 48 75 63 255 1 2 3 4 5 6 7 8 9 10 (0) 46 74 5
33、3 14 26 38 86 65 27 34 (1) 34 14 26 38 27 46 86 65 53 74 (2) 27 14 26 34 38 46 74 65 53 86 (3) 26 14 27 34 38 46 53 65 74 86 (4) 14 26 27 34 38 46 53 65 74 86五、算法分析题 1 (1) 1 22 333 4444 (2) 285 (3) 182. p-data != x p-freq+ current-freq p-freq p-next current3. 从 BT 为树根指针的二叉树上查找值为 X 的结点,若查找成功则返回该结点指针,
34、否则返回空。六、算法设计题 1. /从二叉树中删除根结点值为 x 的子树,若删除成功则返回 1,否则返回 0 int deleteSubtree(bitreptr r, datatype x) if(r=NULL) return 0; else if(r-data=x) r=NULL; return 1; else if(deleteSubtree(r-lchild, x) return 1; if(deleteSubtree(r-rchild, x) return 1; 2. /向二叉搜索树插入元素 int Insert(BTreeNode* BST, const ElemType item
35、) /查找插入位置 BTreeNode* t=BST, *parent=NULL; while(t!=NULL) parent=t; if(item=t-data) return 0; else if(itemt-data) t=t-left; else t=t-right; /建立值为 item,左、右指针域为空的新结点 BTreeNode* p=new BTreeNode; p-data=item; p-left=p-right=NULL; /将新结点插入到二叉搜索树中的确定位置上 if(parent=NULL) BST=p; else if(itemparent-data) parent
36、-left=p; else parent-right=p; 数据结构期末试题 答案2009-01-09 08:17一、 单选题:判断下列各小题叙述的正误。对,在题号前的括号内填入“”;错,在题号前的括号内填入“”。(每小题 3 分,共 24 分) (1)向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。A 8 B 63.5 C 63 D 7 (2)设有一个二元数组 Amn,假设 A00存放位置在 644(10),A22存放位置在 676 (10),每个元素占一个空间,则 A45在( )位置,(10)表明用 10 进数表示。 A 692(10) B 62
37、6(10) C 709(10) D 724(10) (3)一个有顺序表有 255 个对象,采用顺序搜索法查表,平均搜索长度为( ) A 128 B 127 C 126 D 255 (4)含 5 个节点(元素值均不相同)的二叉搜索树有( )种 A 54 B 42 C 36 D 65 (5)在分析折半搜索的性能时常加入失败结点,即外结点,从而形成扩充的二叉树。若设失败结点i 所在层为 l,那么搜索失败到达失败结点时所做的数据比较次数是( )。 A li+1 B li+2 C li-1 D li (6)设有一个含 200 个表项的散列表,用线性探查法解决冲突,按关键码查询时找到一个表项的平均探查次数
38、不超过 1.5,则散列存储空间应能够至少容纳( )个表项。(搜索成功的平均搜索长度为 Snl=(1+1/(1-a)/2,其中 a 为装填因子 A 400 B 526 C 624 D 676 (7)n 个顶点的连通图至少有( )条边 A n-1 B n C n+1 D0 (8)一个二叉树按顺序方式存储在一个一维数组中,如图则结点 E 在二叉树的第( )层。 A 1 B 2 C 3 D 4 二、阅读理解题:说明下面递归过程的功能(10分) int unknown (BinTreeNode * t) /指针 t 是二叉树的跟指针。 if (t=NULL) return 0; elseif (t-le
39、ftChild=NULLt-rightChild=NULL)return 1; else return unknown (t-leftChild)+unknown (t-rightChild); 三、简答题(每小题 12 分,共 36 分) 1.如下所示的连通图,请画出 (1)以顶点为根的深度优先生成树;(6 分) (2)如果有关节点,请找出所有的关节点。(6分)2、设有 13 个初始归并段,其长度分别为28,16,37,42,5,9,13,14,20,17,30,12,18。试画出 4 路归并时的最佳归并树,并计算它的带权路径长度 WPL。 3、设散列表 HT012,即表的大小为 m=13。
40、采用双散列法解决冲突。散列函数和再散列函数分别为: H0(key)=key % 13; 注:%是求余数运算(=mod) Hi=(hi-1+REV (key+1) % 11+1)%13; i=1,2,3,.,m-1 其中,函数 REV(x)表示颠倒 10 进制数 x 的各位,如 REV(37)=73 REV(7)=7 等。若插入的关键码序列为2,8,31,20,19,18,53,27。试画出插入这 8 个关键码后的散列表。四、(10 分) 已知一棵二叉树如下,请分别写出按前序、中序、后序和层次遍历时得到的结点序列。五、综合算法题(10)分 有一种简单的排序算法,叫做记数排序(count Sort
41、ing)。这种排序算法对一个待排序的表(用数组表示)进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键码互不相同。记数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小。假设针对某一个记录,统计出的记数值为 c,那么,这个记录在新的有序表中的合适的存放位置即为 c。 (1)给出适用于记数排序的数据表定义;(4 分) (2)使用 C+语言编写实现记数排序的算法;(4 分)(3)对于有 n 个记录的表,关键码比较次数是多少?(2 分)六、程序填空题(10 分) 下面给出的是一个在二叉树中查找值为 x 的结点,并打印该结点所有祖
42、先结点的算法。在此算法中,假设值为 x 的结点不多于一个。此算法采用后序的非递归遍历形式。因退栈时需要区分其左、右子树是否已经遍历,故在结点进栈时附带有一个标志,=0,进入左子树,=1,进入右子树。用栈ST 保存结点指针 ptr 以及标志 tag。top 是栈顶指针。 void print (BintreeNode * t; Type x) stack ST; int i, top; top=0; /置空栈 while (t ! =NULLt-data ! =x ll top ! =0) while (t ! =NULLt-data ! =x) /寻找值为 x 的结点 1_; STtop.pt
43、r=t; /进栈 STtop.tag=0; 2_; if (t! =NULLt-data=x) /找到值为 x 的结点 for (i=1; 3_;i+) cout ST.ptr-data endl; else while (top 0STtop.tag=1) /未找到值为 x 的结点 top-; if (top 0) ST top.tag=1; /转向右子树 4_; /*print*/ (1)请将缺失的语句补上(共 4 分,每空 1 分)(2)请给出对于右图所示的二叉树,使用上述算法搜索值为 9 的结点和值为 10 的结点的结果,以及在栈 ST 中的变化。(top 是栈顶指针) (6 分) 试
44、题答案 试题 一、(1) B (2) C (3) A (4) B (5) D (6) A (7) A (8) B 二、计算二叉树的叶结点个数。 三、1. (1)该连通图从出发做深度优先搜索,得到的深度优先生成树为:(2)关节点为 2.因为(13-1)%(4-1)=12%3=0,所以不需要添加空段。最佳归并树为WPS=(5+9+13+12+16+14+17+18+28+37+20+30)*2+42=480 3.散列表 HT012,散列函数与再散列函数为 H0(key)=key mod 13; Hi=(Hi-1+REV(key+1) mod 11+1) mod 13 插入关键码序列为2,8,31,
45、20,19,18,53,27 H0(2)=2,比较次数为 1 H0(8)=8,比较次数为 1 H0(31)=5,比较次数为 1 H0(20)=7,比较次数为1 H0(19)=6,比较次数为 1 H0(18)=5,冲突,H1=9,比较次数为 2 H0(53)=1,比较次数为 1 H0(27)=1,冲突,H1=7,冲突 H2=0,比较次数为 3 插入 8 个关键码后的散列表四、 前序:A,B,D,G,C,E,F,H 中序:D,G,B,A,E,C,H,F 后序:G,D,B,E,H,F,C,A 层次:A,B,C,D,E,F,G,H五、(1) const int DefaultSize=100; tem
46、plate class Type class datalist; /数据表的前视声明 template class Type class Element /数据表无元素类的定义 private: Type key; /关键码 field otherdata; /其它数据成员 public: Type getKey ( ) return key; /取当前结点的关键码 void setKey (const Type x) key=x; /将当前结点的关键码修改为 x template class Type class datalist /用顺序表来存储待排序的元素,这些元素的类型是 Type p
47、ublic: datalist (int MaxSz=DefaultSize) : MaxSize (Maxsz),CurrentSize (0) Vector=new Element Type MaxSz; private: Element Type * Vector; /存储待排序元素的向量 int MaxSize,CurrentSize; /最大元素个数与当前元素个数 (2)解答 1 template class Type void countsort (datalist Type initList,datalist Type resultList) int i,j,c; Type refer; for (i=0; iinitList,CurrentSize; i+) c=0; refer :=initList.Vector.getKey ( ); for (j=0; jinitList.CurrentSize; j+) if (initList.Vectorj.getKey ( )refer) c+, resultList.Vectorc=initList.Vector resultList.CurrentSize=initList.CurrentSize; 解答 2 template