第6章查找树of北京联合大学数据结构
北航数据结构试题及答案

北航数据结构试题及答案一、单项选择题(每题2分,共20分)1. 在数据结构中,线性表的顺序存储结构通常使用什么数据结构来实现?A. 链表B. 栈C. 数组D. 树答案:C2. 下列关于二叉树的描述中,错误的是:A. 二叉树的第i层最多有2^(i-1)个节点B. 任意非空二叉树的叶子节点数等于度为2的节点数加1C. 任意非空二叉树的叶子节点数等于度为2的节点数减1D. 任意非空二叉树的叶子节点数等于度为2的节点数答案:C3. 在图的遍历算法中,深度优先搜索(DFS)使用的数据结构是:A. 队列B. 栈C. 链表D. 数组答案:B4. 哈希表的冲突解决方法不包括以下哪种?A. 开放定址法B. 链地址法C. 再散列法D. 排序法答案:D5. 快速排序算法的时间复杂度最坏情况下为:A. O(nlogn)B. O(n^2)C. O(n)D. O(1)答案:B6. 以下排序算法中,时间复杂度为O(nlogn)的是:A. 冒泡排序B. 快速排序C. 选择排序D. 插入排序答案:B7. 以下关于堆的描述中,正确的是:A. 堆是一种特殊的二叉树B. 堆是一种完全二叉树C. 堆是一种平衡二叉树D. 堆是一种链表答案:A8. 在一个长度为n的有序数组中查找一个元素,使用二分查找算法的时间复杂度是:A. O(n)B. O(nlogn)C. O(logn)D. O(1)答案:C9. 以下算法中,不属于动态数据结构的是:A. 链表B. 栈C. 数组D. 哈希表答案:C10. 以下关于图的描述中,错误的是:A. 图是由顶点和边组成的B. 图的顶点可以有0个或多个C. 图的边可以有向或无向D. 图的顶点数一定大于边数答案:D二、多项选择题(每题3分,共15分)1. 下列哪些是线性表的存储结构?A. 顺序存储B. 链式存储C. 索引存储D. 散列存储答案:A, B2. 在图的表示方法中,以下哪些是正确的?A. 邻接矩阵B. 邻接表C. 边表D. 顶点表答案:A, B, C3. 下列哪些排序算法是稳定的?A. 冒泡排序B. 快速排序C. 插入排序D. 选择排序答案:A, C4. 在数据结构中,以下哪些是递归算法的特点?A. 问题可以分解为更小的子问题B. 每个子问题都是原问题的实例C. 存在递归终止条件D. 递归算法的时间复杂度一定比迭代算法高答案:A, B, C5. 在使用链表实现栈时,以下哪些操作是合法的?A. pushB. popC. peekD. clear答案:A, B, C三、简答题(每题5分,共30分)1. 请简述什么是递归,并给出一个递归算法的例子。
基于C语言的数据结构教学技巧

基于C语言的数据结构教学技巧范莉丽;彭涛【摘要】Necessity and significance of studying data structure is described in this paper,and the common problem in the process of data structure teaching is pointed out;an attempt of research and exploration on the teaching mode of data structure based on C language teaching mode is made,and some practical teaching skills are proposed to enhance the student's subjective initiative and improve the teaching effect.%阐述学好数据结构的必要性和重要性;指出在数据结构教学过程普遍存在的问题;探索基于C 语言的数据结构教学模式,提出一些实用的教学技巧,旨在提高学生主观能动性,提高教学效果。
【期刊名称】《计算机教育》【年(卷),期】2011(000)018【总页数】4页(P61-64)【关键词】数据结构;教学模式;主观能动性;教学效果【作者】范莉丽;彭涛【作者单位】北京联合大学信息学院,北京100101;北京联合大学信息学院,北京100101【正文语种】中文【中图分类】G642数据结构在计算机学科中有着重要的地位,起着承上启下的作用。
通过对数据结构的学习可以锻炼学生的逻辑思维能力,提出问题、分析问题和解决问题的能力,为学好后继课程打下坚实的基础[1]。
因为数据结构知识点繁多,理论抽象难以理解,使得数据结构在一开始就被披上了冷冰冰的晦涩难懂,拒学生以千里之外的面纱,神秘却使人失去一探究竟的兴趣和勇气。
北邮数据结构第六章答案详解 图(1)

1
5
1
54 3
42
5 66
图 6-8 图 G 答案:根据不同算法构造的最小生成树如图 6-9 所示的图(a)和(b)
2
④
⑤ 5
1
①
4 3
②
③
6
2
⑤
③ 5
1
①
4 3
④
②
6
(a) Prim 生成树
(b) Kruskal 生成树
图 6-9 最小生成树
5、算法设计
(1)以邻接表为存储结构,设计实现深度优先遍历的非递归算法。
int top = -1; cout<<v<<’\t’; bVisited[v] = true; stack[++top] = v;
//访问结点 v //设置访问标记 //结点 v 入栈
while (top!=-1)
{
v=stack[top];
ArcNode<T> *p = adjlist[v]. firstarc; ①
)
A.1
B. n/2
C.n-1
D.n
解析:若超过 n-1,则路径中必存在重复的顶点
答案:C
(5) 若一个图中包含有 k 个连通分量,若按照深度优先搜索的方法访问所有顶点,则必
须调用(
)次深度优先搜索遍历的算法。
A.k
B.1
C.k-1
D.k+1
解析:一次深度优先搜索可以访问一个连通分量中的所有结点,因此 k 个连通分量需要 调用 k 次深度优先遍历算法。
④
} if (p==NULL) top--;
⑤//若是找不到未访问的结点,出栈
大学数据结构课件--第9章 查找

二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p
国家开放大学《数据结构(本)》综合练习题参考答案

C. 6 D. 7 24.如下图所示,若从顶点 a 出发,按图的广度优先搜索法进行遍历,则可能得 到的一种顶点序列为( )。
A. aebcfd B. abecdf C. aedfcb D. aecbdf 25.如下图所示,若从顶点 a 出发,按图的深度优先搜索法进行遍历,则可能得 到的一种顶点序列为( )。
结点。(根所在结点为第 1 层) 35.(中序)遍历一棵二叉排序树可得到一个有序序列。 36 中序遍历一棵(二叉排序树)可得到一个有序序列。 37.广义表(c,(a,b,c),(d,e,f),((i,j),k))的长度是(4)。 38.待排序的序列为 9,4,5,1,2,6,10,采用直接选择排序算法,当进行了 两趟选择后,结果序列为(1,2,5,9,4,6,10)。 39.广义表的(c,(b,a,b),f,e,((i,j),k))深度是(3)。 40.广义表((a,b),d,e,((i,j),k))的长度是(4)。 41.序列 4,2,5,3,8,6,采用冒泡排序算法(升序),经一趟冒泡后,结果序 列是(2,4,3,5,6,8)。 42.广义表的(c,a,(a,b),d,e,((i,j),k))深度是(3) 。 43.待排序的序列为 8,3,4,1,2,5,9,采用直接选择排序算法,当进行了两 趟选择后,结果序列为(1,2,4,8,3,5,9)。 44.线性表用(顺序)方式存储需要占用连续的存储空间。 45.线性表用(顺序)方式存储可以随机访问。 46.线性表用关键字(有序)的顺序方式存储,可以用二分法排序。 47.顺序表 6,5,1,2,4,3,8,7 经过一趟(1,1)归并后的结果序列为 ((5,6),(1,2),(3,4),(7,8))。 二、单项选择题 1.栈和队列的共同特点是( )。
A. acfebgd B. aedfcgb C. aebcfgd D. abecdfg 26.线性表以(
严蔚敏《数据结构》(第2版)笔记和习题(含考研真题)详解

目录分析
1.2强化习题详解
1.1复习笔记
1.3考研真题与典 型题详解
2.2强化习题详解
2.1复习笔记
2.3考研真题与典 型题详解
3.2强化习题详解
3.1复习笔记
3.3考研真题与典 型题详解
Hale Waihona Puke 4.2强化习题详解4.1复习笔记
4.3考研真题与典 型题详解
5.2强化习题详解
5.1复习笔记
5.3考研真题与典 型题详解
严蔚敏《数据结构》(第2版)笔 记和习题(含考研真题)详解
读书笔记模板
01 思维导图
03 目录分析 05 读书笔记
目录
02 内容摘要 04 作者介绍 06 精彩摘录
思维导图
关键字分析思维导图
习题
数据结构
笔记
名校
复习
重难点
第章
笔记
教材
真题 真题
存储管理
第版
典型
二叉树
习题 题
树 动态
内容摘要
严蔚敏所著的《数据结构》(第2版,清华大学出版社)是我国高校采用较多的计算机专业优秀教材,也被众 多高校指定为计算机专业考研参考书目。作为该教材的辅导书,本书具有以下几个方面的特点:1.整理名校笔记, 浓缩内容精华。在参考了国内外名校名师讲授严蔚敏《数据结构》的课堂笔记基础上,本书每章的复习笔记部分 对该章的重难点进行了整理,同时对重要知识点进行点拨,因此,本书的内容几乎浓缩了配套教材的知识精华。 2.归纳典型题,强化知识考点。为了进一步巩固和强化各章知识难点的复习,特针对该教材的重难点相应整理了 典型强化习题,并对相关知识点进行归纳和延伸,梳理知识点逻辑关系,以达到高效复习的目的。3.精选考研真 题,巩固重难点知识。为了强化对重要知识点的理解,本书精选了部分名校近几年的数据结构考研真题,这些高 校大部分以该教材作为考研参考书目。所选考研真题基本涵盖了各个章节的考点和难点,特别注重联系实际,凸 显当前热点。要深深牢记:考研不同一般考试,概念题(名词解释)要当作简答题来回答,简答题要当作论述题 来解答,而论述题的答案要像是论文,多答不扣分。有的论述题的答案简直就是一份优秀的论文(其实很多考研 真题就是选自一篇专题论文),完全需要当作论文来回答!
(完整word版)数据结构第九章查找

第九章查找:习题习题一、选择题1.散列表查找中k个关键字具有同一散列值,若用线性探测法将这k个关键字对应的记录存入散列表中,至少要进行( )次探测。
A. k B。
k+l C. k(k+l)/2 D. l+k (k+l)/22.下述命题( )是不成立的。
A。
m阶B-树中的每一个结点的子树个数都小于或等于mB。
m阶B-树中的每一个结点的子树个数都大于或等于『m/2-1C。
m阶B-树中的每一个结点的子树高度都相等D。
m阶B—树具有k个子树的非叶子结点含有(k-l)个关键字3.如果要求一个基本线性表既能较快地查找,又能适应动态变化的要求,可以采用( )查找方法.A。
分块 B. 顺序 C. 二分 D.散列4.设有100个元素,用折半查找法进行查找时,最大比较次数是( ),最小比较次数是( ).A。
7,1 B.6,l C.5,1 D. 8,15.散列表长m=15,散列表函数H(key)=key%13。
表中已有4个结点:addr(18)=5;addr(32)=6; addr(59)=7;addr(73)=8;其余地址为空,如果用二次探测再散列处理冲突,关键字为109的结点的地址是( )。
A. 8 B。
3 C. 5 D。
46.用分块查找时,若线性表中共有729个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分( )个结点最佳。
A。
15 B. 27 C。
25 D。
307.散列函数有一个共同性质,即函数值应当以( )取其值域的每个值。
A.同等概率B。
最大概率C。
最小概率D。
平均概率8.设散列地址空间为O.。
m—1,k为关键字,假定散列函数为h(k)=k%p,为了减少冲突,一般应取p为( )。
A.小于m的最大奇数B. 小于m的最大素数C.小于m的最大偶数D.小于m的最大合数9.当向一棵m阶的B-树做插入操作时,若使一个结点中的关键字个数等于( ),则必须分裂成两个结点。
A。
m B。
m-l C.m+l D。
数据结构课后习题及解析第六章

第六章习题1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。
2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。
3.已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,……,nk个度为k的结点,则该树中有多少个叶子结点并证明之。
4.假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。
5.已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?6.给出满足下列条件的所有二叉树:①前序和后序相同②中序和后序相同③前序和后序相同7. n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child 域有多少个?8.画出与下列已知序列对应的树T:树的先根次序访问序列为GFKDAIEBCHJ;树的后根次序访问序列为DIAEKFCJHBG。
9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10请为这8个字母设计哈夫曼编码。
10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点指针,是否可不用递归且不用栈来完成?请简述原因.11. 画出和下列树对应的二叉树:12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。
13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。
14.分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。
在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。
15.分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。
16.编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。
17.对以孩子-兄弟链表表示的树编写计算树的深度的算法。
18.已知二叉树按照二叉链表方式存储,利用栈的基本操作写出后序遍历非递归的算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
王郁昕
二叉查找树的问题
• 树可能变高,并且可能退化成链
没有右孩子
没有左孩子
王郁昕
结点的旋转
左旋 右旋
王郁昕
结点旋转的目的
• 平衡左右子树的的高度,以便降低整个二 叉查找树的高度,防止树退化成链
• 同时保持二叉查找树的性质不能改变,即 旋转的结果仍然是一颗二叉查找树
王郁昕
结点的旋转
• 左旋:根向左下右上 • 右旋:根向右下左上
#1行 #2行 #4行 #5行 #10行 #11行 #12行
右旋
• 右旋与左旋对称,只需如下对调即可实现 • x与y对调 • left与right对调
王郁昕
AVL树
定义 旋转 插入与删除
王郁昕
AVL树(平衡树)
AVL树是二叉查找树(BST)的一种,并具有以下特性:
• AVL树是一种高度平衡的二叉查找树,对于 每一个结点,其左右子树的高度至多差1 • AVL树的每个结点包括5个数据项: h、key、left、right、p • h表示结点的高度,显然 h(x)=Max(x.left.h, x.right.h)+1 h(leaf)=1
1
Leonardo Pisano Bigollo (c. 1170 – c. 1250)
王郁昕
AVL树的旋转
• • • • RR旋转(左旋) LL旋转(右旋) RL旋转 LR旋转
• 旋转目的:保持AVL树的性质
王郁昕
王郁昕
王郁昕
王郁昕
AVL树的结点插入
插入操作分两部分: • TREE-INSERT(T, z) #插入结点z • AVL-BALANCE(z) #平衡由于新插入的结点 z而产生的不平衡
王郁昕
AVL-BALANCE(z) #z是新加入的结点 1 y=x=z.p 2 while x ≠ NIL 3 if Height(x.left) - Height(x.right) > 1 #左高右低 4 if Height(x.left.right)<Height( x.left.left) #x.left的左孩子高于右孩子,case1 5 y=x.left 6 RIGHT-ROTATE(T, x) 7 x.h=MaxHeight(x.left, x.right)+1 8 else y=x.left.right # x.left的左孩子低于右孩子,case2 9 LEFT-ROTATE(T, x.left) 10 RIGHT-ROTATE(T, y.p) 11 y.left.h=MaxHeight(y.left.left, y.left.right)+1 12 y.right.h=MaxHeight(y.right.left, y.right.right)+1 13 if Height(x.right) - Height(x.left) > 1 #右高左低 14 if Height(x.right.left)< Height(x.right.right ) #x.right的右孩子高于左孩子,case3 15 y=x.right 16 LEFT-ROTATE(T, x) 17 x.h=MaxHeight(x.left, x.right)+1 18 else y=x.right.left #x.right的的右孩子低于左孩子,case4 19 RIGHT-ROTATE(T, x.right) 20 LEFT-ROTATE(T, y.p) 21 y.left.h=MaxHeight(y.left.left, y.left.right)+1 22 y.right.h=MaxHeight(y.right.left, y.right.right)+1 23 y.h=MaxHeight(y.left, y.right)+1 24 y=x=y.p #平衡检测点向上移动一层,直到2行条件不满足 25 return y #y是树根
#1行 #2行 #4行 #5行 #10行 #11行 #12行
王郁昕
处理次序: β(2~4) y, x.p(5~10) x(11~12)
β == 14 x →11 y →18
11.right →14 14.p →11 18.p →7 7.right →18 18.left →11 11.p →18
王郁昕
目录
• • • • • • • • 第一章 基本概念 第二章 线性表 第三章 栈和队列 第四章 树和二叉树 第五章查找 第六章查找树 第七章 排序 第八章 图
王郁昕
第五章 查找树(BST)
二叉查找树 AVL树 B树
王郁昕
二叉查找树/二叉排序树(BST)
a
b
二叉查找树任何一个结点x包含key、left、right、p 如果y是x左子树的一个结点,则y.key ≤ x.key 如果y是x右子树的一个结点,则x.key ≤ y.key
王郁昕
排序序列: 2、3、4、6、7、9、13、15、17、18、20 7的前驱6,后继9 15的前驱13,后继17
王郁昕
求后继( successor )
TREE-SUCCESSOR(x) 1 if x.right ≠ NIL 2 return TREE-MINIMUM (x.right) 3 y = x.p 4 while y ≠ NIL and x == y.right 5 x=y 6 y = y.p 7 return y
求前驱( predecessor )
TREE-PREDECESSOR(x) 1 if x.left ≠ NIL 2 return TREE-MAXIMUM (x.left) 3 y = x.p 4 while y ≠ NIL and x == y.left 5 x=y 6 y = y.p 7 return y
处理次序:β,y,x.p, x 注意:旋转后BST的性质不变
王郁昕
LEFT-ROTATE(T, x) #T表示一颗树 1 y = x.right #y指向x的右孩子 2 x.right = y.left #β(y.left)连接上x,孩子指针处理 3 if y.left ≠NIL 4 y.left.p = x #β(y.left)连接上x,父亲指针处理 5 y.p = x.p 6 if x.p == NIL 7 T.root = y 8 else if x == x.p.left #如果x是左孩子 9 x.p.left = y 10 else x.p.right = y 11 y.left = x 12 x.p = y x →11 y →18 11.right →14 14.p →11 18.p →7 7.right →18 18.left →11 11.p →18
王郁昕
TREE-INSERT(T, z) 1 y = NIL 2 x = T.root 3 while x ≠ NIL 4 y=x #y是x的父亲 5 if z.key < x.key 6 x = x.left 7 else x = x.right 8 z.p = y 9 if y == NIL 10 T.root= z # Tree T was empty 11 else if z.key < y.key 12 y.left = z 13 else y.right = z
• 如果二叉查找树中的某个结点没有右孩子 ,则该结点的后继一定是有左孩子的祖先 ,并且后继的左孩子也同样是该结点的祖 先。(即祖先是右..右左的情况,这里的右左指的是“是右孩子”
或“是左孩子” )
王郁昕
自己总结
• 总结前驱左..左右的情况
左 右 右 右 左
王郁昕
插入结点
• 将新结点z插入到二叉查找树T中,并成为树 的叶子 • z.key==k; z.left==NIL; z.right==NIL • TREE-INSERT(T, z)
王郁昕
Python中的random
import random random.randint(i, n) #random(i, n)
random. shuffle(A)
王郁昕
直接删除结点z
删除的三种情况: • z没有子女,即z是叶子 • z只有一个子女 • z有两个子女(如果二叉查找树中的某个结点有两个子女,则其后 继没有左子女)
王郁昕
调平衡算法的特点
• 当某一结点出现1<|hL – hR |<3时才调整 • 从z结点采用自底向上的方法调整,直到根 结点。 • 如果z是叶子,则在自底向上的调整路径上 所涉结点的高度无需事先知道,因为它们 会被重新计算(算法第23行)
王郁昕
求结点的高度
#x是一结点 Height(x) 1 h=0 2 if x ≠ NIL 3 h=x.h 4 return h #left,right分别表示左右孩子结点 MaxHeight(left, right) 1 hL=Height(left) 2 hR=Height(right) 3 if hL > hR 4 return hL 5 else return hR
王郁昕
算法分析
• 算法每递归查找一次就下降一层 • 所以前面的算法的递归步骤都不超过BST的 树高 • 算法的运行时间都为(h),h为BST的树高
王郁昕
输出BST的排序序列
• 使用中序遍历,可以输出BST树的整个排序 序列
• 在排序序列中有“前驱”和“后继”的概 念
INORDER-TREE-WALK(x) 1 if x ≠ NIL 2 INORDER-TREE-WALK(x.left) 3 访问 x.key 4 INORDER-TREE-WALK(x.right)
王郁昕
Hale Waihona Puke AVL树(平衡树)第二种表示
AVL树是二叉查找树(BST)的一种,并具有以下特性:
• AVL树是一种高度平衡的二叉查找树,对于 每一个结点,其左右子树的高度至多差1 • AVL树的每个结点包括5个数据项: bf、key、left、right、p (bf:balance factor平衡因子,结点左子树的 高度减去右子树的高度,即bf=hL-hR) • AVL树中每个结点的bf=-1/0/1