《数据结构》习题汇编08 第八章 查找 试题.doc

上传人:豆**** 文档编号:29963752 上传时间:2022-08-02 格式:DOC 页数:55 大小:106KB
返回 下载 相关 举报
《数据结构》习题汇编08 第八章 查找 试题.doc_第1页
第1页 / 共55页
《数据结构》习题汇编08 第八章 查找 试题.doc_第2页
第2页 / 共55页
点击查看更多>>
资源描述

《《数据结构》习题汇编08 第八章 查找 试题.doc》由会员分享,可在线阅读,更多相关《《数据结构》习题汇编08 第八章 查找 试题.doc(55页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

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 C. n/2 D. (n+1)/27.

3、 对于长度为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 B. log2n C. (h+1)/2 D. h+111. 从具

4、有n个结点的二叉搜索树中搜索一个元素时,在等概率情况下进行成功搜索的时间复杂度大致为( )。A. O(n) B. O(1) C. O(log2n) D. O(n2)12. 从具有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树(高度平衡的二叉搜索树)中,每个结点的平衡因子的取值范围是( )。 A. -11

5、 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树(高度平衡的二叉搜索树)插入元素时,可能引起对最小不平衡子树的双向旋转的调整过程,此时需要修改相关( )个结点指针域的值。 A. 2 B. 3 C. 4 D. 5参考答案:1. D2. C

6、3. A4. B5. A6. B7. C 8. A9. D10. D11. C12. A13. B14. A15. C16. A17. C二、填空题1. 以顺序搜索方法从长度为n的顺序表或单链表中搜索一个元素时,其时间复杂度为_。2. 对长度为n的搜索表进行搜索时,假定搜索第i个元素的概率为pi,搜索长度(即在搜索过程中依次同有关元素比较的总次数)为ci,则在搜索成功情况下的平均搜索长度的计算公式为_。3. 假定一个顺序表的长度为40,并假定搜索每个元素的概率都相同,则在搜索成功情况下的平均搜索长度为_。4. 以折半搜索方法从长度为n的有序表中搜索一个元素时,时间复杂度为_。5. 从有序表 (

7、12, 18, 30, 43, 56, 78, 82, 95) 中折半搜索元素56时,其搜索长度为_。6. 假定对长度n = 50的有序表进行折半搜索,则对应的判定树中最后一层的结点数为_个。7. 从一棵二叉搜索树中搜索一个元素时,若给定值小于根结点的值,则需要向_继续搜索。8. 从一棵二叉搜索树中搜索一个元素时,若给定值大于根结点的值,则需要向_继续搜索。9. 向一棵二叉搜索树中插入一个新元素时,若该新元素的值小于根结点的值,则应把它插入到根结点的_上。10. 向一棵二叉搜索树中插入一个新元素时,若该新元素的值大于根结点的值,则应把它插入到根结点的_上。11. 向一棵二叉搜索树_一个元素时,

8、若查找到的根结点为空值,则应把该元素结点链接到这个空指针位置上。12. 根据n个元素建立一棵二叉搜索树的时间复杂度性大致为_。13. 在一棵AVL树(高度平衡的二叉搜索树)中,每个结点的左子树高度与右子树高度之差的绝对值不超过_。14. 根据一组记录 ( 56, 42, 50, 64, 48 ) 依次插入结点生成一棵AVL树(高度平衡的二叉搜索树)时,当插入到值为_的结点时需要进行旋转调整。 15. 根据一组记录 ( 56, 74, 63, 64, 48 ) 依次插入结点生成一棵AVL树(高度平衡的二叉搜索树)时,当插入到值为63的结点时需要进行_调整。16. 根据一组记录 ( 56, 42,

9、 38, 64, 48 ) 依次插入结点生成一棵AVL树(高度平衡的二叉搜索树)时,当插入到值为38的结点时需要进行_调整。17. 根据一组记录 ( 56, 42, 73, 50, 64, 48, 22 ) 依次插入结点生成一棵AVL树(高度平衡的二叉搜索树)时,当插入到值为_的结点时才出现不平衡,需要进行旋转调整。 18. 在一棵AVL树(高度平衡的二叉搜索树)上进行插入或删除元素时,所需的时间复杂度为_。参考答案:1. O(n)2. 3. 20.54. O(log2n)5. 36. 197. 左子树8. 右子树9. 左子树10. 右子树11. 插入12. O(nlog2n)13. 114.

10、 5015. 先右后左双旋转16. 右单旋转17. 4818. O(lon2n) 三、判断题1. 在顺序表中进行顺序搜索时,若各元素的搜索概率不等,则各元素应按照搜索概率的降序排列存放,则可得到最小的平均搜索长度。2. 进行折半搜索的表必须是顺序存储的有序表。3. 能够在链接存储的有序表上进行折半搜索,其时间复杂度与在顺序存储的有序表上相同。4. 假定用两个有序单链表表示两个集合,则这两个集合交运算得到的集合单链表,其长度小于参加运算的任一个集合单链表的长度。5. 假定用两个有序单链表表示两个集合,则这两个集合的差运算得到的集合单链表,其长度小于参加运算的任一个集合单链表的长度。6. 折半搜索

11、所对应的判定树,既是一棵二叉搜索树,又是一棵理想平衡二叉树(它的特点是除最底层结点外其他各层结点数都是满的,最底层的若干结点可能散布在该层各处)。7. 对二叉搜索树进行前序遍历得到的结点序列是一个有序序列。8. 在由n个元素组成的有序表上进行折半搜索时,对任一个元素进行搜索的长度(即比较次数)都不会大于log2n+1。9. 根据n个元素建立一棵二叉搜索树的时间复杂度大致为O(log2n)。10. 根据n个元素建立一棵二叉搜索树的时间复杂度大致为O(nlog2n)。11. 对于同一组记录,若生成二叉搜索树时插入记录的次序不同则得到不同结构的二叉搜索树。12. 对于同一组记录,生成二叉搜索树的结构

12、与插入记录的次序无关。13. 对于两棵具有相同记录集合而具有不同结构的二叉搜索树,按中序遍历得到的结点序列是相同的。14. 在二叉搜索树中,若各结点的搜索概率不等,使得搜索概率越大的结点离树根越近,则得到的是最优二叉搜索树。15. 在二叉搜索树中,若各结点的搜索概率不等,使得搜索概率越小的结点离树根越近,则得到的是最优二叉搜索树。参考答案:1. 是2. 是3. 否4. 是5. 否6. 是7. 否8. 是9. 否10. 是11. 是12. 否13. 是14. 是15. 否四、运算题1. 一个一维数组a10中存储着一个有序表,该有序表为:(15, 26, 34, 39, 45, 56, 58, 6

13、3, 74, 76 ),根据折半搜索所对应的判定树,写出该判定树的广义表表示,并求出在等概率情况下搜索成功的平均搜索长度。判定树的广义表表示:_平均搜索长度:_2. 已知一个有序表 ( 15, 26, 34, 39, 45, 56, 58, 63, 74, 76, 83, 94 ) 顺序存储于一维数组a12中,根据折半搜索过程填写成功搜索下表中所给元素34, 56, 58, 63, 94时的比较次数。34 56 58 63 94 元素值 比较次数3. 假定一个线性序列为 ( 38, 52, 25, 74, 68, 16, 30, 54, 90, 72 ),根据此线性序列中元素的排列次序生成一棵

14、二叉搜索树,求出对该二叉搜索树查找38, 74, 68, 30, 72等元素时的比较次数。38 74 68 30 72 待查元素: 比较次数:4. 假定一个线性序列为 ( 56, 27, 34, 95, 73, 16, 50, 62, 65 ),根据此线性序列中元素的排列次序生成一棵二叉搜索树,求出该二叉搜索树的高度(假定树根结点的高度为0)、度为2的结点个数和叶子结点个数。高度:_度为2的结点个数:_叶子结点个数:_5. 假定一个线性序列为 ( 38, 42, 55, 15, 23, 44, 30, 74, 48, 26 ),根据此线性序列中元素的排列次序生成一棵二叉搜索树,求出该二叉搜索树

15、中左子树为空的所有单支结点和右子树为空的所有单支结点,请按从小到大的次序排列写出。左子树为空的所有结点:_右子树为空的所有结点:_6. 已知一棵二叉搜索树的广义表表示为:28 (12 ( , 16), 49 (34 (30), 72 (63) ) ),按主教材介绍的删除算法,求出从中依次删除72, 12, 49, 28结点后得到的二叉搜索树的广义表表示。广义表表示:_7. 假定一组数据对象为 ( 40, 28, 16, 56, 50, 32, 30, 63 ),按次序插入每个对象生成一棵AVL树(高度平衡的二叉搜索树),根据插入过程填写下表,在相应位置填写所需要的调整类型:“左单旋转”、“右单

16、旋转”、“先左后右双旋转”、“先右后左双旋转”,若不需要旋转则填写“无”。40 28 16 56 50 32 30 63 数据: 调整:8. 假定一组数据对象为 ( 40, 28, 16, 56, 50, 32, 30, 63, 44, 38 ),按次序插入每个对象生成一棵AVL树(高度平衡的二叉搜索树),请回答插入后需调整的结点个数和插入后不调整的结点个数。插入时伴随旋转调整的结点个数:_插入不调整的结点个数:_ 9. 假定一组记录为 ( 36, 75, 83, 54, 12, 67, 60, 40 ),按次序插入每个结点生成一棵AVL树(高度平衡的二叉搜索树),请回答在插入时需进行“左单旋

17、转”、“右单旋转”、“先左后右双旋转”、“先右后左双旋转”,“不调整”的结点数各是多少?左单旋转结点个数:_右单旋转结点个数:_先左后右双旋转结点个数:_先右后左双旋转结点个数:_不调整结点个数:_10. 假定一组记录为 ( 38, 42, 55, 15, 23, 44, 30, 74, 48, 26 ),按次序插入每个结点生成一棵AVL树(高度平衡的二叉搜索树),给出最后得到的AVL树中度为2、度为1和度为0的结点个数。度为2的结点个数:_度为1的结点个数:_度为0的结点个数:_参考答案:1. 判定树的广义表表示:45 (26 (15, 34 ( , 39 ) ), 63 ( 56 ( ,

18、58 ), 74 ( , 76 ) ) ) /4分平均查找长度:29/10/2分34 56 58 63 9402 1 3 4 42. 判断结果元素值 比较次数 /对1个给1分,全对给6分38 74 68 30 7201 3 4 3 53. 判断结果待查元素:比较次数:/对1个给1分,全对给6分4. 高度:4 /2分度为2的结点个数:2 /2分叶子结点个数:3 /2分5. 左子树为空的结点:15, 23, 42, 44 /全对4分,否则不得分右子树为空的结点:30 /2分6. 广义表表示:30 (16 , 63 (34) )7. 插入结果和调整类型为40 28 16 56 50 32 30 63

19、无 无 右单旋 无 先右后左 先右后左 无 左单旋 双旋转 双旋转插入数据: 调整类型: 8. 插入时伴随旋转调整的结点个数:4 /3分,若误差1给1分,其余情况不得分插入不调整的结点个数:6 /3分,若误差1给1分,其余情况不得分9. 左单旋转结点个数:1 /1分右单旋转结点个数:0 /1分先左后右双旋转结点个数:1 /1分先右后左双旋转结点个数:0 /1分不调整结点个数:6 /2分10. 度为2的结点个数:4 /2分度为1的结点个数:1 /2分度为0的结点个数:5 /2分五、算法分析题1. 已知二叉搜索树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNo

20、de ElemType data;BinTreeNode *leftChild, *rightChild; ;其中data为结点值域,leftChild和rightChild分别为指向左、右子女结点的指针域。假定具有BinTreeNode*类型的指针参数BST指向一棵二叉搜索树的根结点,试根据下面的函数定义指出此算法所能实现的功能。ElemType unknown ( BinTreeNode* BST ) if ( BST = NULL ) cerr 此树为空树 rightChild != NULL ) t = t-rightChild;return t-data; 算法功能:_2. 假定p1

21、和p2是两个有序单链表的表头指针,用来表示两个集合,单链表中的结点包括值域data和指向后继结点的指针域link,试根据下面算法指出算法功能。LinkNode* unknown ( LinkNode* p1, LinkNode* p2 ) LinkNode* p3 = new LinkNode, * p = p3;while ( p1 != NULL & p2 != NULL ) LinkNode* newptr = new LinkNode; if ( p1-data data ) newptr-data = p1-data; p1 = p1-link; else if ( p1-data

22、p2-data ) newptr-data = p2-data; p2 = p2-link; else newptr-data = p1-data; p1 = p1-link; p2 = p2-link; 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是两个单链表的表头指针,用

23、来表示两个集合,单链表中的结点包括值域data和指向后继结点的指针域link,试根据下面算法指出算法功能。int unknown ( LinkNode* p1, LinkNode* p2 ) while ( 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单链表中的结点包括值域

24、data和指向后继结点的指针域link,试根据下面算法指出算法功能。void unknown ( LinkNode *& HL, const ElemType& item ) LinkNode* newptr; Newptr = new LinkNode; Newptr-data = item; if ( HL = NULL | item data ) newptr-link = HL; HL = newptr; return; LinkNode *cp, *ap; ap = HL; cp = HL-link;while (cp != NULL ) if ( item data ) break

25、; ap = cp; cp = cp-link; newptr-link = cp; ap-link = newptr;算法功能:_5. 已知二叉搜索树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode ElemType data;BinTreeNode *leftChild, *rightChild; ;其中data为结点值域,leftChild和rightChild分别为指向左、右子女结点的指针域。假定pt所指向的二叉搜索树的广义表表示为: 25 (10 (5, 16 (12) ), 40 (32 ( , 38) ) ),按照下面算法,则: (1)

26、执行unknown ( pt, 40 ) 调用后返回的值为_。 (2) 执行unknown ( pt, 38 ) 调用后返回的值为_。 (1) 执行unknown ( pt, 5 ) 调用后返回的值为_。 (1) 执行unknown ( pt, 60 ) 调用后返回的值为_。 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 );els

27、ereturn 1+unknown ( t-rightChild, x );6. 已知二叉树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode ElemType data;BinTreeNode *leftChild, *rightChild; ;其中data为结点值域,leftChild和rightChild分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数bt指向一棵二叉树的根结点,引用参数x初始具有最小值(即小于树中所有结点的值),试根据下面的函数定义指出此算法所能实现的功能。 int unknown ( BinT

28、reeNode* bt, ElemType& x ) if ( bt = NULL ) return 1;else if (unknown ( bt-leftChild, x ) = 0 ) return 0; if ( bt-data data;if (unknown ( bt-rightChild, x ) = 0 ) return 0; else return 1; 算法功能:_参考答案: 1. 算法功能:从二叉搜索树BST中查找出具有最大值的结点并返回这个值。2. 算法功能:实现集合的并运算,即把有序单链表表示的两个集合合并为一个新的集合,并由函数返回新集合的表头指针。3. 算法功能:

29、判断p2单链表所代表的集合是否为p1单链表所代表的集合的子集合,若是则返回1否则返回0。4. 算法功能:向表示集合的有序单链表HL中插入一个新元素,使得插入后仍然保持集合单链表有序。5. (1) 2 /2分(2) 4 /2分(3) 3 /2分(4) 0 /2分6. 算法功能:判断二叉树bt是否为一棵二叉搜索树,若是则返回1否则返回0。六、算法设计题1. 假定元素类型为ElemType的一维数组Rn 中保存着按关键码升序排列的n个对象,对象的关键码域key的类型为KeyType,试按照下面的函数声明编写一个非递归算法,从一维数组Rn中用折半搜索法找出关键码等于k的对象,若搜索成功则返回对象位置(

30、即元素下标),否则返回-1。 int BinSearch ( ElemType R , int n, KeyType k );2. 已知二叉搜索树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode ElemType data;BinTreeNode *leftChild, *rightChild; ;其中data为结点值域,leftChild和rightChild分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数BST指向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个非递归算法,从BST树中查找出具有x参数值的结点

31、,若查找成功则返回该结点的地址,否则返回NULL。 BinTreeNode* Find ( BinTreeNode* BST, ElemType& x );3. 已知二叉搜索树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode ElemType data;BinTreeNode *leftChild, *rightChild; ;其中data为结点值域,leftChild和rightChild分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数BST指向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个递归算法,向BST

32、树中插入值为x的结点,若树中不存在x结点则进行插入并返回1表示插入成功,若树中已存在x结点则不插入并返回0表示插入失败。 int Insert ( BinTreeNode *& BST, const ElemType& x );4. 已知二叉搜索树中的结点类型用BinTreeNode表示,被定义为: struct BinTreeNode ElemType data;BinTreeNode *leftChild, *rightChild; ;其中data为结点值域,leftChild和rightChild分别为指向左、右子女结点的指针域。假定具有BinTreeNode * 类型的指针参数BST指

33、向一棵二叉搜索树的根结点,试根据下面的函数声明编写一个非递归算法,向BST树中插入值为x的结点,若树中不存在x结点则进行插入并返回1表示插入成功,若树中已存在x结点则不插入并返回0表示插入失败。 int insert ( BinTreeNode*& BST, const ElemType& x );参考答案:1. 算法如下:int BinSearch ( ElemType R , int n, KeyType k ) int low = 0, high = n-1; /赋初值2分while ( low = high ) /循环条件1分int mid = (low + high) / 2;/中点

34、位置1分 if ( k = Rmid.key ) return mid;/成功返回1分 else if ( k data ) return BST; /成功返回2分else if ( x data ) BST = BST-leftChild; /向左孩子查找2分else BST = BST-rightChild; /向右孩子查找2分return NULL; /失败返回1分3. 算法如下:int Insert ( BinTreeNode*& BST, const ElemType& x ) if ( BST = NULL ) /插入新结点2分 BinTreeNode* p = new BinTr

35、eeNode;p-data = 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分4. 算法如下:int Insert ( BinTreeNode*& BST, const ElemType& x ) BinTreeNo

36、de* t = BST, *parent = NULL; while ( t != NULL ) /查找插入位置,3分 parent = t;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分55 / ; ; - ( / = (置位确索到插将 ; = ,立建 -= 0 = = ,位/) ( , * )& &* 下 素树向/; 素插左) ) ( 返不 ; - ( ; - * 点新 = ,& 下 回/ 找右/; = 找子/ - ) 返成 ) - = 条环 ! ( & ,*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com