1、1数据结构课程(本科)第七章试题一、单项选择题1. 若搜索每一个元素的概率相等,则在长度为 n 的顺序表上搜索到表中任一元素的平均搜索长度为( ) 。A. n B. n+1 C. (n-1)/2 D. (n+1)/22. 对长度为 10 的顺序表进行搜索,若搜索前面 5 个元素的概率相同,均为 1/8,搜索后面 5 个元素的概率相同,均为 3/40,则搜索到表中任一元素的平均搜索长度为( ) 。A. 5.5 B. 5 C. 39/8 D. 19/43. 对长度为 3 的顺序表进行搜索,若搜索第一个元素的概率为 1/2,搜索第二个元素的概率为 1/3,搜索第三个元素的概率为 1/6,则搜索到表中
2、任一元素的平均搜索长度为( ) 。A. 5/3 B. 2 C. 7/3 D. 4/34. 对长度为 n 的有序单链表,若搜索每个元素的概率相等,则顺序搜索到表中任一元素的平均搜索长度为( ) 。A. n/2 B. (n+1)/2 C. (n-1)/2 D. n/45. 对于长度为 n 的有序顺序表,若采用折半搜索,则对所有元素的搜索长度中最大的为( )的值的向上取整。A. log2(n+1) B. log2n C. n/2 D. (n+1)/26. 对于长度为 n 的有序顺序表,若采用折半搜索,则对所有元素的搜索长度中最大的为( )的值的向下取整加一。A. log2(n+1) B. log2n
3、 C. n/2 D. (n+1)/27. 对于长度为 9 的有序顺序表,若采用折半搜索,在等概率情况下搜索成功的平均搜索长度为( )的值除以 9。A. 20 B. 18 C. 25 D. 228. 对于长度为 18 的有序顺序表,若采用折半搜索,则搜索第 15 个元素的搜索长度为( ) 。A. 3 B. 4 C. 5 D. 69. 对具有 n 个元素的有序顺序表进行折半搜索,则搜索任一元素的时间复杂度为( ) 。A. O(n) B. O(n2) C. O(1) D. O(log2n)10. 在一棵高度为 h 的具有 n 个元素的二叉搜索树中,搜索所有元素的搜索长度中最大的为( ) 。A. n
4、B. log2n C. (h+1)/2 D. h+111. 从具有 n 个结点的二叉搜索树中搜索一个元素时,在等概率情况下进行成功搜索的时间复杂度大致为( ) 。A. O(n) B. O(1) C. O(log2n) D. O(n2)212. 从具有 n 个结点的二叉搜索树中搜索一个元素时,在最坏情况下进行成功搜索的时间复杂度为( ) 。A. O(n) B. O(1) C. O(log2n) D. O(n2)13. 向具有 n 个结点的二叉搜索树中插入一个元素时,其时间复杂度大致为( ) 。A. O(1) B. O(log2n ) C. O(n) D. O(nlog2n)14. 在一棵 AVL
5、 树(高度平衡的二叉搜索树)中,每个结点的平衡因子的取值范围是( ) 。A. -11 B. -22 C. 12 D. 0115. 向一棵 AVL 树(高度平衡的二叉搜索树)插入元素时,可能引起对最小不平衡子树的调整过程,此调整分为( )种旋转类型。A. 2 B. 3 C. 4 D. 516. 向一棵 AVL 树(高度平衡的二叉搜索树)插入元素时,可能引起对最小不平衡子树的左单或右单旋转的调整过程,此时需要修改相关( )个结点指针域的值。A. 2 B. 3 C. 4 D. 517. 向一棵 AVL 树(高度平衡的二叉搜索树)插入元素时,可能引起对最小不平衡子树的双向旋转的调整过程,此时需要修改相
6、关( )个结点指针域的值。A. 2 B. 3 C. 4 D. 5参考答案: 1. D 2. C 3. A 4. B 5. A6. B 7. C 8. A 9. D 10. D11. C 12. A 13. B 14. A 15. C16. A 17. C二、填空题1. 以顺序搜索方法从长度为 n 的顺序表或单链表中搜索一个元素时,其时间复杂度为_。2. 对长度为 n 的搜索表进行搜索时,假定搜索第 i 个元素的概率为 pi,搜索长度(即在搜索过程中依次同有关元素比较的总次数)为 ci,则在搜索成功情况下的平均搜索长度的计算公式为_。3. 假定一个顺序表的长度为 40,并假定搜索每个元素的概率都
7、相同,则在搜索成功情况下的平均搜索长度为_。4. 以折半搜索方法从长度为 n 的有序表中搜索一个元素时,时间复杂度为_。5. 从有序表 (12, 18, 30, 43, 56, 78, 82, 95) 中折半搜索元素 56 时,其搜索长度为_。6. 假定对长度 n = 50 的有序表进行折半搜索,则对应的判定树中最后一层的结点数为_个。37. 从一棵二叉搜索树中搜索一个元素时,若给定值小于根结点的值,则需要向_继续搜索。8. 从一棵二叉搜索树中搜索一个元素时,若给定值大于根结点的值,则需要向_继续搜索。9. 向一棵二叉搜索树中插入一个新元素时,若该新元素的值小于根结点的值,则应把它插入到根结点
8、的_上。10. 向一棵二叉搜索树中插入一个新元素时,若该新元素的值大于根结点的值,则应把它插入到根结点的_上。11. 向一棵二叉搜索树_一个元素时,若查找到的根结点为空值,则应把该元素结点链接到这个空指针位置上。12. 根据 n 个元素建立一棵二叉搜索树的时间复杂度性大致为_。13. 在一棵 AVL 树(高度平衡的二叉搜索树)中,每个结点的左子树高度与右子树高度之差的绝对值不超过_。14. 根据一组记录 ( 56, 42, 50, 64, 48 ) 依次插入结点生成一棵 AVL 树(高度平衡的二叉搜索树)时,当插入到值为_的结点时需要进行旋转调整。 15. 根据一组记录 ( 56, 74, 6
9、3, 64, 48 ) 依次插入结点生成一棵 AVL 树(高度平衡的二叉搜索树)时,当插入到值为 63 的结点时需要进行_调整。16. 根据一组记录 ( 56, 42, 38, 64, 48 ) 依次插入结点生成一棵 AVL 树(高度平衡的二叉搜索树)时,当插入到值为 38 的结点时需要进行_调整。17. 根据一组记录 ( 56, 42, 73, 50, 64, 48, 22 ) 依次插入结点生成一棵 AVL 树(高度平衡的二叉搜索树)时,当插入到值为_的结点时才出现不平衡,需要进行旋转调整。 18. 在一棵 AVL 树(高度平衡的二叉搜索树)上进行插入或删除元素时,所需的时间复杂度为_。参考
10、答案: 1. O(n) 2. 3. 20.5 4. O(log2n)10niicp5. 3 6. 19 7. 左子树 8. 右子树9. 左子树 10. 右子树 11. 插入 12. O(nlog2n)13. 1 14. 50 15. 先右后左双旋转 16. 右单旋转17. 48 18. O(lon2n) 三、判断题1. 在顺序表中进行顺序搜索时,若各元素的搜索概率不等,则各元素应按照搜索概率的降序排列存放,4则可得到最小的平均搜索长度。2. 进行折半搜索的表必须是顺序存储的有序表。3. 能够在链接存储的有序表上进行折半搜索,其时间复杂度与在顺序存储的有序表上相同。4. 假定用两个有序单链表表示
11、两个集合,则这两个集合交运算得到的集合单链表,其长度小于参加运算的任一个集合单链表的长度。5. 假定用两个有序单链表表示两个集合,则这两个集合的差运算得到的集合单链表,其长度小于参加运算的任一个集合单链表的长度。6. 折半搜索所对应的判定树,既是一棵二叉搜索树,又是一棵理想平衡二叉树(它的特点是除最底层结点外其他各层结点数都是满的,最底层的若干结点可能散布在该层各处) 。7. 对二叉搜索树进行前序遍历得到的结点序列是一个有序序列。8. 在由 n 个元素组成的有序表上进行折半搜索时,对任一个元素进行搜索的长度(即比较次数)都不会大于 log2n+1。9. 根据 n 个元素建立一棵二叉搜索树的时间
12、复杂度大致为 O(log2n)。10. 根据 n 个元素建立一棵二叉搜索树的时间复杂度大致为 O(nlog2n)。11. 对于同一组记录,若生成二叉搜索树时插入记录的次序不同则得到不同结构的二叉搜索树。12. 对于同一组记录,生成二叉搜索树的结构与插入记录的次序无关。13. 对于两棵具有相同记录集合而具有不同结构的二叉搜索树,按中序遍历得到的结点序列是相同的。14. 在二叉搜索树中,若各结点的搜索概率不等,使得搜索概率越大的结点离树根越近,则得到的是最优二叉搜索树。15. 在二叉搜索树中,若各结点的搜索概率不等,使得搜索概率越小的结点离树根越近,则得到的是最优二叉搜索树。参考答案: 1. 是
13、2. 是 3. 否 4. 是 5. 否6. 是 7. 否 8. 是 9. 否 10. 是11. 是 12. 否 13. 是 14. 是 15. 否四、运算题1. 一个一维数组 a10中存储着一个有序表,该有序表为:(15, 26, 34, 39, 45, 56, 58, 63, 74, 76 ),根据折半搜索所对应的判定树,写出该判定树的广义表表示,并求出在等概率情况下搜索成功的平均搜索长5度。判定树的广义表表示:_平均搜索长度:_2. 已知一个有序表 ( 15, 26, 34, 39, 45, 56, 58, 63, 74, 76, 83, 94 ) 顺序存储于一维数组 a12中,根据折半搜
14、索过程填写成功搜索下表中所给元素 34, 56, 58, 63, 94 时的比较次数。元素值 比较次数3. 假定一个线性序列为 ( 38, 52, 25, 74, 68, 16, 30, 54, 90, 72 ),根据此线性序列中元素的排列次序生成一棵二叉搜索树,求出对该二叉搜索树查找 38, 74, 68, 30, 72 等元素时的比较次数。待查元素:比较次数:4. 假定一个线性序列为 ( 56, 27, 34, 95, 73, 16, 50, 62, 65 ),根据此线性序列中元素的排列次序生成一棵二叉搜索树,求出该二叉搜索树的高度(假定树根结点的高度为 0) 、度为 2 的结点个数和叶子
15、结点个数。高度:_度为 2 的结点个数:_叶子结点个数:_5. 假定一个线性序列为 ( 38, 42, 55, 15, 23, 44, 30, 74, 48, 26 ),根据此线性序列中元素的排列次序生成一棵二叉搜索树,求出该二叉搜索树中左子树为空的所有单支结点和右子树为空的所有单支结点,请按从小到大的次序排列写出。左子树为空的所有结点:_右子树为空的所有结点:_6. 已知一棵二叉搜索树的广义表表示为:28 (12 ( , 16), 49 (34 (30), 72 (63) ) ),按主教材介绍的删除算法,求出从中依次删除 72, 12, 49, 28 结点后得到的二叉搜索树的广义表表示。广义
16、表表示:_7. 假定一组数据对象为 ( 40, 28, 16, 56, 50, 32, 30, 63 ),按次序插入每个对象生成一棵 AVL 树(高度平衡的二叉搜索树) ,根据插入过程填写下表,在相应位置填写所需要的调整类型:“左单旋转” 、 “右单旋转” 、 “先左后右双旋转” 、 “先右后左双旋转” ,若不需要旋转则填写“无” 。数据: 调整:8. 假定一组数据对象为 ( 40, 28, 16, 56, 50, 32, 30, 63, 44, 38 ),按次序插入每个对象生成一棵 AVL 树(高度平衡的二叉搜索树) ,请回答插入后需调整的结点个数和插入后不调整的结点个数。34 56 58
17、63 9438 74 68 30 7240 28 16 56 50 32 30 636插入时伴随旋转调整的结点个数:_插入不调整的结点个数:_9. 假定一组记录为 ( 36, 75, 83, 54, 12, 67, 60, 40 ),按次序插入每个结点生成一棵 AVL 树(高度平衡的二叉搜索树) ,请回答在插入时需进行“左单旋转” 、 “右单旋转” 、 “先左后右双旋转” 、 “先右后左双旋转” , “不调整”的结点数各是多少?左单旋转结点个数:_右单旋转结点个数:_先左后右双旋转结点个数:_先右后左双旋转结点个数:_不调整结点个数:_10. 假定一组记录为 ( 38, 42, 55, 15,
18、 23, 44, 30, 74, 48, 26 ),按次序插入每个结点生成一棵 AVL 树(高度平衡的二叉搜索树) ,给出最后得到的 AVL 树中度为 2、度为 1 和度为 0 的结点个数。度为 2 的结点个数:_度为 1 的结点个数:_度为 0 的结点个数:_参考答案:1. 判定树的广义表表示:45 (26 (15, 34 ( , 39 ) ), 63 ( 56 ( , 58 ), 74 ( , 76 ) ) ) /4 分平均查找长度:29/10 /2 分2. 判断结果元素值 比较次数 /对 1 个给 1 分,全对给 6 分3. 判断结果待查元素:比较次数: /对 1 个给 1 分,全对给
19、6 分4. 高度:4 /2 分度为 2 的结点个数:2 /2 分叶子结点个数:3 /2 分5. 左子树为空的结点:15, 23, 42, 44 /全对 4 分,否则不得分右子树为空的结点:30 /2 分6. 广义表表示:30 (16 , 63 (34) )7. 插入结果和调整类型为34 56 58 63 9402 1 3 4 438 74 68 30 7201 3 4 3 57插入数据:调整类型: 8. 插入时伴随旋转调整的结点个数:4 /3 分,若误差 1 给 1 分,其余情况不得分插入不调整的结点个数:6 /3 分,若误差 1 给 1 分,其余情况不得分9. 左单旋转结点个数:1 /1 分
20、右单旋转结点个数:0 /1 分先左后右双旋转结点个数:1 /1 分先右后左双旋转结点个数:0 /1 分不调整结点个数:6 /2 分10. 度为 2 的结点个数:4 /2 分度为 1 的结点个数:1 /2 分度为 0 的结点个数:5 /2 分五、算法分析题1. 已知二叉搜索树中的结点类型用 BinTreeNode 表示,被定义为:struct BinTreeNode ElemType data; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域。假定具有BinTr
21、eeNode*类型的指针参数 BST 指向一棵二叉搜索树的根结点,试根据下面的函数定义指出此算法所能实现的功能。ElemType unknown ( BinTreeNode* BST ) if ( BST = NULL ) cerr rightChild != NULL ) t = t-rightChild;return t-data;算法功能:_2. 假定 p1 和 p2 是两个有序单链表的表头指针,用来表示两个集合,单链表中的结点包括值域 data 和指向后继结点的指针域 link,试根据下面算法指出算法功能。LinkNode* unknown ( LinkNode* p1, LinkNo
22、de* p2 ) LinkNode* p3 = new LinkNode, * p = p3;while ( p1 != NULL if ( p1-data data ) 40 28 16 56 50 32 30 63无 无 右单旋 无 先右后左 先右后左 无 左单旋双旋转 双旋转8 newptr-data = p1-data; p1 = p1-link; else if ( p1-data p2-data ) newptr-data = p2-data; p2 = p2-link; else newptr-data = p1-data; p1 = p1-link; p2 = p2-link;
23、 p3-link = newptr; p3 = newptr;if ( p2 != NULL ) p1 = p2;while (p1 != NULL ) p3 = p3-link = new LinkNode;p3-data = p1-data; p1 = p1-link;p3-link = NULL;return p-link;算法功能:_3. 假定 p1 和 p2 是两个单链表的表头指针,用来表示两个集合,单链表中的结点包括值域 data 和指向后继结点的指针域 link,试根据下面算法指出算法功能。int unknown ( LinkNode* p1, LinkNode* p2 ) wh
24、ile ( p2 != NULL ) LinkNode* r = p1;while ( r != NULL ) if ( p2-data = r-data ) break;r = r-link;if ( r = NULL ) return 0;p2 = p2-link;return 1;算法功能:_4. 假定 HL 为保存一个集合的有序单链表的表头指针,item 为一个新元素,HL 单链表中的结点包括值域 data 和指向后继结点的指针域 link,试根据下面算法指出算法功能。void unknown ( LinkNode *Newptr = new LinkNode;Newptr-data
25、= item;if ( HL = NULL | item data ) newptr-link = HL; HL = newptr;return;9LinkNode *cp, *ap; ap = HL; cp = HL-link;while (cp != NULL ) if ( item data ) break;ap = cp; cp = cp-link;newptr-link = cp;ap-link = newptr;算法功能:_5. 已知二叉搜索树中的结点类型用 BinTreeNode 表示,被定义为:struct BinTreeNode ElemType data; BinTreeN
26、ode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域。假定 pt 所指向的二叉搜索树的广义表表示为: 25 (10 (5, 16 (12) ), 40 (32 ( , 38) ) ),按照下面算法,则:(1) 执行 unknown ( pt, 40 ) 调用后返回的值为_。(2) 执行 unknown ( pt, 38 ) 调用后返回的值为_。(1) 执行 unknown ( pt, 5 ) 调用后返回的值为_。(1) 执行 unknown ( pt, 60 ) 调用后返回的值为_
27、。int unknown ( BinTreeNode* t, ElemType x ) if ( t = NULL ) return 0;else if ( t-data = x ) return 1;else if ( t-data x ) return 1+unknown ( t-leftChild, x );elsereturn 1+unknown ( t-rightChild, x );6. 已知二叉树中的结点类型用 BinTreeNode 表示,被定义为:struct BinTreeNode ElemType data; BinTreeNode *leftChild, *rightC
28、hild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数 bt 指向一棵二叉树的根结点,引用参数 x 初始具有最小值(即小于树中所有结点的值),试根据下面的函数定义指出此算法所能实现的功能。int unknown ( BinTreeNode* bt, ElemTypeelse if (unknown ( bt-leftChild, x ) = 0 ) return 0;if ( bt-data data;if (unknown ( bt-rightChild, x ) = 0 )
29、 return 0;else return 1;10算法功能:_参考答案:1. 算法功能:从二叉搜索树 BST 中查找出具有最大值的结点并返回这个值。2. 算法功能:实现集合的并运算,即把有序单链表表示的两个集合合并为一个新的集合,并由函数返回新集合的表头指针。3. 算法功能:判断 p2 单链表所代表的集合是否为 p1 单链表所代表的集合的子集合,若是则返回 1 否则返回 0。4. 算法功能:向表示集合的有序单链表 HL 中插入一个新元素,使得插入后仍然保持集合单链表有序。5. (1) 2 /2 分(2) 4 /2 分(3) 3 /2 分(4) 0 /2 分6. 算法功能:判断二叉树 bt 是
30、否为一棵二叉搜索树,若是则返回 1 否则返回 0。六、算法设计题1. 假定元素类型为 ElemType 的一维数组 Rn 中保存着按关键码升序排列的 n 个对象,对象的关键码域 key 的类型为 KeyType,试按照下面的函数声明编写一个非递归算法,从一维数组 Rn中用折半搜索法找出关键码等于 k 的对象,若搜索成功则返回对象位置(即元素下标) ,否则返回-1。int BinSearch ( ElemType R , int n, KeyType k );2. 已知二叉搜索树中的结点类型用 BinTreeNode 表示,被定义为:struct BinTreeNode ElemType dat
31、a; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数 BST 指向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个非递归算法,从 BST 树中查找出具有 x 参数值的结点,若查找成功则返回该结点的地址,否则返回 NULL。BinTreeNode* Find ( BinTreeNode* BST, ElemType3. 已知二叉搜索树中的结点类型用 BinTreeNode 表示,被定义为:struct Bi
32、nTreeNode ElemType data; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数 BST 指向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个递归算法,向 BST 树中插入值为 x 的结点,若树中不存在 x 结点则进行插入并返回 1 表示插入成功,若树中已存在 x 结点则不插入并返回 0 表示插入失败。11int Insert ( BinTreeNode *4. 已知二叉搜索树中的结点类型
33、用 BinTreeNode 表示,被定义为:struct BinTreeNode ElemType data; BinTreeNode *leftChild, *rightChild; ;其中 data 为结点值域,leftChild 和 rightChild 分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数 BST 指向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个非递归算法,向 BST 树中插入值为 x 的结点,若树中不存在 x 结点则进行插入并返回 1 表示插入成功,若树中已存在 x 结点则不插入并返回 0 表示插入失败。int insert (
34、 BinTreeNode*参考答案:1. 算法如下:int BinSearch ( ElemType R , int n, KeyType k ) int low = 0, high = n-1; /赋初值 2 分while ( low data ) return BST; /成功返回 2 分else if ( x data ) BST = BST-leftChild; /向左孩子查找 2 分else BST = BST-rightChild; /向右孩子查找 2 分return NULL; /失败返回 1 分3. 算法如下:int Insert ( BinTreeNode*p-data =
35、x; p-leftChild = p-rightChild = NULL;BST = p;return 1;else if ( x = BST-data ) return 0; /不插入返回 2 分else if ( x data ) return Insert ( BST-leftChild, x ); /向左子树插入元素 2 分else return Insert ( BST-rightChild, x ); /向右子树插入元素 2 分124. 算法如下:int Insert ( BinTreeNode* while ( t != NULL ) /查找插入位置, 3 分parent = t
36、;if ( x = t-data ) return 0;else if ( x data ) t = t-leftChild;else t = t-rightChild;BinTreeNode* p = new BinTreeNode; /建立新结点,2 分p-data = x; p-leftChild = p-rightChild = NULL;/将新结点插入到二叉搜索树中的确定位置上if ( parent = NULL ) BST = p; /1 分else if ( x data ) parent-leftChild = p; /1 分else parent-rightChild = p; /1 分