二叉排序树用于动态查找
数据结构第五章 查找 答案

数据结构与算法上机作业第五章查找一、选择题1、若构造一棵具有n个结点的二叉排序树,在最坏情况下,其高度不超过 B 。
A. n/2B. nC. (n+1)/2D. n+12、分别以下列序列构造二叉排序数(二叉查找树),与用其他3个序列所构造的结果不同的是 C :A. (100, 80, 90, 60, 120, 110, 130)B. (100, 120, 110, 130, 80, 60, 90)C. (100, 60, 80, 90, 120, 110, 130)D. (100, 80, 60, 90, 120, 130, 110)3、不可能生成下图所示的二叉排序树的关键字的序列是 A 。
A. 4 5 3 1 2B. 4 2 5 3 1C. 4 5 2 1 3D. 4 2 3 1 54、在二叉平衡树中插入一个结点造成了不平衡,设最低的不平衡点为A,并已知A的左孩子的平衡因子为0,右孩子的平衡因子为1,则应作 C 型调整使其平衡。
A. LLB. LRC. RLD. RR5、一棵高度为k的二叉平衡树,其每个非叶结点的平衡因子均为0,则该树共有 C 个结点。
A. 2k-1-1B. 2k-1+1C. 2k-1D. 2k+16、具有5层结点的平衡二叉树至少有 A 个结点。
A. 12B. 11C. 10D. 97、下面关于B-和B+树的叙述中,不正确的是 C 。
A. B-树和B+树都是平衡的多叉树B. B-树和B+树都可用于文件的索引结构C. B-树和B+树都能有效地支持顺序检索D. B-树和B+树都能有效地支持随机检索8、下列关于m阶B-树的说法错误的是 D 。
A. 根结点至多有m棵子树B. 所有叶子结点都在同一层次C. 非叶结点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树D. 根结点中的数据是有序的9、下面关于哈希查找的说法正确的是 C 。
A. 哈希函数构造得越复杂越好,因为这样随机性好,冲突小B. 除留余数法是所有哈希函数中最好的C. 不存在特别好与坏的哈希函数,要视情况而定D. 若需在哈希表中删去一个元素,不管用何种方法解决冲突都只要简单地将该元素删去即可10、与其他查找方法相比,散列查找法的特点是 C 。
二叉树的优点和缺点

⼆叉树的优点和缺点
⼆叉排序树是⼀种⽐较有⽤的折衷⽅案。
数组的搜索⽐较⽅便,可以直接⽤下标,但删除或者插⼊某些元素就⽐较⿇烦。
链表与之相反,删除和插⼊元素很快,但查找很慢。
⼆叉排序树就既有链表的好处,也有数组的好处。
在处理⼤批量的动态的数据是⽐较有⽤。
⽂件系统和数据库系统⼀般都采⽤树(特别是B树)的数据结构数据,主要为排序和检索的效率。
⼆叉树是⼀种最基本最典型的排序树,⽤于教学和研究树的特性,本⾝很少在实际中进⾏应⽤,因为缺点太明显了(看看教科书怎么说的)。
就像冒泡排序⼀样,虽然因为效率问题并不实⽤,单不失⼀种教学例⼦的好⼿段。
平衡⼆叉树都有哪些应⽤场景
⼆叉树⽀持动态的插⼊和查找,保证操作在O(height)时间,这就是完成了哈希表不便完成的⼯作,动态性。
但是⼆叉树有可能出现worst-case,如果输⼊序列已经排序,则时间复杂度为O(N)
平衡⼆叉树/红⿊树就是为了将查找的时间复杂度保证在O(logN)范围内。
所以如果输⼊结合确定,所需要的就是查询,则可以考虑使⽤哈希表,如果输⼊集合不确定,则考虑使⽤平衡⼆叉树/红⿊树,保证达到最⼤效率
平衡⼆叉树主要优点集中在快速查找。
如果你知道SGI/STL的set/map底层都是⽤红⿊树(平衡⼆叉树的⼀种)实现的,相信你会对这些树⼤有兴趣。
缺点:
顺序存储可能会浪费空间(在⾮完全⼆叉树的时候),但是读取某个指定的节点的时候效率⽐较⾼O(0)
链式存储相对⼆叉树⽐较⼤的时候浪费空间较少,但是读取某个指定节点的时候效率偏低O(nlogn)。
二叉排序树

二叉排序树1.二叉排序树定义二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值。
(2)左右子树也都是二叉排序树,如图6-2所示。
2.二叉排序树的查找过程由其定义可见,二叉排序树的查找过程为:(1)若查找树为空,查找失败。
(2)查找树非空,将给定值key与查找树的根结点关键码比较。
(3)若相等,查找成功,结束查找过程,否则:①当给值key小于根结点关键码,查找将在以左孩子为根的子树上继续进行,转(1)。
②当给值key大于根结点关键码,查找将在以右孩子为根的子树上继续进行,转(1)。
3.二叉排序树插入操作和构造一棵二叉排序树向二叉排序树中插入一个结点的过程:设待插入结点的关键码为key,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,该插入结点已存在,不用插入;查找不成功时,则插入之。
因此,新插入结点一定是作为叶子结点添加上去的。
构造一棵二叉排序树则是逐个插入结点的过程。
对于关键码序列为:{63,90,70,55,67,42,98,83,10,45,58},则构造一棵二叉排序树的过程如图6-3所示。
4.二叉排序树删除操作从二叉排序树中删除一个结点之后,要求其仍能保持二叉排序树的特性。
设待删结点为*p(p为指向待删结点的指针),其双亲结点为*f,删除可以分三种情况,如图6-4所示。
(1)*p结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以,只需将被删结点的双亲结点相应指针域改为空指针,如图6-4(a)所示。
(2)*p结点只有右子树或只有左子树,此时,只需将或替换*f结点的*p子树即可,如图6-4(b)、(c)所示。
(3)*p结点既有左子树又有右子树,可按中序遍历保持有序地进行调整,如图6-4(d)、(e)所示。
设删除*p结点前,中序遍历序列为:① P为F的左子女时有:…,Pi子树,P,Pj,S子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…。
二叉排序树在动态检索中的应用研究

13 构 造 实 例 .
上所有结点的值均大于它的根结点的值; ③它的左 、 右子
树也 分别 为二 叉排 序树 。 作 用 于二 叉排 序 树上 的基本 操 作 的时 间 与树 的 高度 成 正 比. 对一 棵 含 n个 节点 的完全 二 叉树 . 些操 作 的最 这 坏 情 况 运 行 时 间为 O( gn , 如 果 树 是 含 n个 节 点 的 1 )但 o 线 性链 . 则这 些操 作 的最 坏情 况运 行 时 间为 O( ) n。 12 二 叉排 序树 的构 造 方法 -
根 据数 据 表 中 的信 息 。 们 可 以建立 二 叉排 序树 . 我 表 中 的每 行记 录看 成 一 个 包 含若 干数 据 项 的数 据结 点 . 为
这 个 结 点 设 置 I ( 点 编 号 )N ME ( 点名 称 )F D 结 、A 结 、A. T R N O( 点 的 父 结 点信 息 )S NI F 结 点 与 父 结 HE I F 结 、O N O(
根据 超 市管 理 系统 中商 品信 息表 里 的数 据 .我 们选 用毛巾、 皂 、 香 卡通 书 、 电饭 锅 、 球 、 摩 器 六 件 商 品 为 篮 按 例 来 说 明 构 造 过 程 把 以 上 六 种 商 品 的 信 息 补 充 到
C MMO IY REE 中 . 得 到 表 2 其 中 F HE NF O DT T 可 . AT RI O
第1 9卷 第 3期
21 0 0年 5 月
重 庆 电子 工 程 职 业 学 院 学报
o um a fCho g i g Co e eo e to i gne fng lo n qn n g fElcr n cEn i e i
数据结构_查找原理及典型的查找算法

3.对非线性(树)结构如何进行折半查找? 可借助二叉排序树来查找(属动态查找表形式)。
9.1.2 有序表的查找
折半查找过程可以描述为一棵二叉树
折半查找的判定树 如:(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
总之:
二叉排序树既有类似于折半查找的特性,又采用了链 表存储,它是动态查找表的一种适宜表示。
一、二叉排序树
(3)构造过程: 例:输入序列{45,12,37,3,53,100,24}
45
12
53
3
37
100
24
一、二叉排序树
(2)非递归查找过程 BiTree SearchBST(BiTree T,KeyType key){
CH9 查找
查找的基本概念 9.1 静态查找表
9.1.1 顺序查找 9.1.2 有序表的查找 9.1.3 索引顺序表的查找
9.2 动态查找表
9.2.1 二叉排序树和平衡二叉树 9.2.2 B-和B+树
9.3 哈希表
查找的基本概念
1.查找表 2.查找
关键字 主关键字 次关键字
}
9.2.1 二叉排序树和平衡二叉树
一、二叉排序树 二、平衡二叉树
一、二叉排序树
1.定义、特点、构造过程
(1)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储
介绍二叉排序树的结构和特点

介绍二叉排序树的结构和特点二叉排序树,也称为二叉搜索树或二叉查找树,是一种特殊的二叉树结构,其主要特点是左子树上的节点都小于根节点,右子树上的节点都大于根节点。
在二叉排序树中,每个节点都存储着一个关键字,而且所有的关键字都不相同。
二叉排序树的结构如下:1.根节点:二叉排序树的根节点是整个树的起始点,其关键字是最大的。
2.左子树:根节点的左子树包含着小于根节点关键字的所有节点,且左子树本身也是一个二叉排序树。
3.右子树:根节点的右子树包含着大于根节点关键字的所有节点,且右子树本身也是一个二叉排序树。
二叉排序树的特点如下:1.有序性:二叉排序树的最重要特点是有序性。
由于左子树上的节点都小于根节点,右子树上的节点都大于根节点,所以通过中序遍历二叉排序树,可以得到一个有序的序列。
2.快速查找:由于二叉排序树是有序的,所以可以利用二叉排序树进行快速查找操作。
对于给定的关键字,可以通过比较关键字与当前节点的大小关系,逐步缩小查找范围,最终找到目标节点。
3.快速插入和删除:由于二叉排序树的有序性,插入和删除操作比较简单高效。
插入操作可以通过比较关键字的大小关系,找到合适的位置进行插入。
删除操作可以根据不同情况,分为三种情况处理:删除节点没有子节点、删除节点只有一个子节点和删除节点有两个子节点。
4.可以用于排序:由于二叉排序树的有序性,可以利用二叉排序树对一组数据进行排序。
将数据依次插入二叉排序树中,然后再通过中序遍历得到有序序列。
二叉排序树的优缺点如下:1.优点:(1)快速查找:通过二叉排序树可以提供快速的查找操作,时间复杂度为O(log n)。
(2)快速插入和删除:由于二叉排序树的有序性,插入和删除操作比较简单高效。
(3)可以用于排序:通过二叉排序树可以对一组数据进行排序,时间复杂度为O(nlog n)。
2.缺点:(1)受数据分布影响:如果数据分布不均匀,可能导致二叉排序树的高度增加,从而降低了查找效率。
(2)不适合大规模数据:对于大规模数据,二叉排序树可能会导致树的高度过高,从而影响了查找效率。
武汉商学院软件工程专业大二2017-2018数据结构与算法第十一单元测试

武汉商学院软件工程专业大二2017-2018数据结构与算法第十一单元测试您的姓名: [填空题] *_________________________________1.边查找,边改变集合内的元素的查找表是()。
[单选题] *A.静态查找表B.动态查找表(正确答案)C.混合查找表D.都不对2.二叉排序树的叶子结点个数为5个,则度为2的结点的数目是()。
[单选题] *A.6B.5C.4(正确答案)D.33.根据二叉排序树的特点,查找过程类似于()。
[单选题] *A.顺序查找B.折半查找(正确答案)C.随机查找D.都不对4.二叉排序树是否可能是一棵完全二叉树()。
[单选题] *A.不可能B.可能(正确答案)C.不确定能不能D.都不对5.二叉排序树的第3层多有多少个结点()。
[单选题] *A.2B.4(正确答案)C.8D.16.二叉排序树[]经常使用的方式。
()。
[单选题] *A.动态查找(正确答案)B.静态查找C.随机查找D.都不对7.二叉排序树的()上结点的值都小于根结点的值()。
[单选题] *A.左子树(正确答案)B.右子树C.左子树和右子树D.都不对8.二叉排序树的()上结点的值都大于根结点的值()。
[单选题] *A.左子树B.右子树(正确答案)C.左子树和右子树D.都不对9.二叉排序树的定义具有()。
[单选题] *A.反复性B.递归性(正确答案)C.回溯性D.都不对10.二叉排序树()为空二叉排序树()。
[单选题] *A.可以(正确答案)B.不可以C.为空或不空都可以D.都不对11.先序遍历一颗二叉排序树的顺序()。
[单选题] *A.左子树根结点右子树B.根结点左子树右子树(正确答案)C.左子树右子树根结点D.都不对12.只查找不改变集合内的元素的查找表是()。
[单选题] *A.静态查找表(正确答案)B.动态查找表C.不确定D.都不对13.静态查找表是指()。
[单选题] *A.只查找不改变集合内的元素。
数据结构:第9章 查找2-二叉树和平衡二叉树

return(NULL); else
{if(t->data==x) return(t);
if(x<(t->data) return(search(t->lchild,x));
else return(search(t->lchild,x)); } }
——这种既查找又插入的过程称为动态查找。 二叉排序树既有类似于折半查找的特性,又采用了链表存储, 它是动态查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
讨论1:二叉排序树的插入和查找操作 例:输入待查找的关键字序列=(45,24,53,45,12,24,90)
二叉排序树的建立 对于已给定一待排序的数据序列,通常采用逐步插入结点的方 法来构造二叉排序树,即只要反复调用二叉排序树的插入算法 即可,算法描述为: BiTree *Creat (int n) //建立含有n个结点的二叉排序树 { BiTree *BST= NULL;
for ( int i=1; i<=n; i++) { scanf(“%d”,&x); //输入关键字序列
– 法2:令*s代替*p
将S的左子树成为S的双亲Q的右子树,用S取代p 。 若C无右子树,用C取代p。
例:请从下面的二叉排序树中删除结点P。
F P
法1:
F
P
C
PR
C
PR
CL Q
CL QL
Q SL
S PR
QL S
SL
法2:
F
PS
C
PR
CL Q
QL SL S SL
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 选择排序: Procedure selectsort (var r:arraytype);
begin for i:=1 to n-1 do Begin k:=i; for j:=i+1 to n do begin if r[j]<r[k] then k:=j end; if k<>i then begin temp:=r[i]; r[i]:=r[k]; r[k]:=temp; end; end; end;
procedure search(num:longint); var top,end1,mid:longint;
begin top:=0;end1:=n; if end-top<=1 then mid:=end1; while (end1-top>1)and(a[top]<>num) do begin mid:=(top+end1) div 2; if num<=a[mid] then top:=mid
软硬件等环境因素,有时容易掩盖算法本 身的优劣性。
事先分析估算的方法
• A)依据的算法选用何种策略; • B)问题的规模。例如求100以内还是
10000以内的素数; • C)书写程序的语言。对于同一个算法,实
现语言的级别越高,执行效率就越低; • D)编译程序产生的机器代码的质量; • E)机器执行指令的速度。
• 时间复杂度:
• 一个算法中的语句执行次数称为语句频度 或时间频度。记为T(n)。
例如在如下所示的两个N*N矩阵相乘的算法 中,“乘法”运算时“矩阵相乘问题”的基本 操作。 for i:=1 to n do for j:=1 to n do begin c[i,j]:=0; for k:=1 to n do c[i,j]:=c[i,j]+a[i,k]*b[k,j] end;
整个算法的执行时间与该基本操作(乘法) 重复执行的次数N³成正比,记T(N)=O(N³)。
“O”的形式定义为:若f(n)是正整数n的一个 函数,则xn=O(f(n))表示存在一个正的常数 M,使得当n>=n0时都满足|xn|<=M|f(n)|
空间复杂度
• 是程序运行所以需要的额外消耗存储空间, 一般的递归算法就要有o(n)的空间复杂度了, 简单说就是递ห้องสมุดไป่ตู้集算时通常是反复调用同 一个方法,递归n次,就需要n个空间。 (这个空间到底多大?我们姑且把它当作 每次调用时分配的内存大小,到底多大, 它自己确定)
procedure search2(num:longint); var i,j:longint; begin for i:=1 to n do
if a[i]=num then writeln(i); end;
二分查找法
若中间项的值等于 x ,则说明查到,查找结束。 若 x 小于中间项的值,则在线性表的前半部分 (即中间项以前的部分)以相同的方法进行查找; 若 x 大于中间项的值,则在线性表的后半部分 (即中间项以后的部分)以相同的方法进行查找; 这个过程一直进行到查找成功或子表长度为 0 (说明线性表中没有这个元素)为止。
• 一个算法是由控制结构(顺序、分支和循 环)和原操作(指固有数据类型的操作) 构成的,则算法时间取决于两者的综合效 果。
• 为了便于比较同一问题的不同算法,通常 的做法是,从算法中选取一种对于所研究 的问题(或算法类型)来说是基本运算的 原操作,以该基本操作重复执行的次数作 为算法的时间量度。
时间复杂度
• 显然,同一个算法用不同的语言实现,或 者用不同的编译程序进行编译,或者在不 同的计算机上运行时,效率均不相同。
• 这表明使用绝对的时间单位衡量算法的效 率是不合适的。撇开这些与计算机硬件、 软件有关的因素,可以认为一个特定算法 “运行工作量”的大小,只依赖于问题的 规模(通常用整数量n表示),或者说,它 是问题规模的函数。
• 一般情况下,算法中基本操作重复执行的 次数是问题规模n的某个函数,用T(n)表示, 若有某个辅助函数f(n),使得当n趋近于无穷 大时,T(n)/f (n)的极限值为不等于零的常数, 则称f(n)是T(n)的同数量级函数。记作 T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复 杂度,简称时间复杂度。
• 例:给出一个还有n个数的有序序列,要求查给定 的一个数x是否在序列中,若在则给出所在序列中 所处的位置。
输入:第一行输入两个数n和x 第二行为n个数
输出:x在序列中所处的位置的序号 样例:input: 6 61
12 35 58 60 61 100 output: 5
顺序查找
• 从线性表的第一个元素开始,依次将线 性表中的元素被查元素进行比较,若相等 则表示找到(即查找成功);若线性表中 所有的元素都与被查元素进行比较但都不 相等,则表示线性表中没有要找的元素 (即查找失败)。
• 我们在判读算法的优劣时,往往是综合考 虑时间复杂度和空间复杂度两个因素,一 般是希望能够找到两个都省的方法,但事 实上我们往往需要牺牲时间复杂度来成全 空间,或牺牲空间来节省时间。因此我们 需要根据题目要求,选择侧重节省的因素。
• 更多的时候由于空间的耗费我们一般可以 容忍,所以我们会更关注时间复杂度对算 法的影响。
else end1:=mid; end; if a[top]=num then writeln(top); end;
显然,当有序线性表为顺序存储时才采
用二分法查找,并且,二分查找的效率要 比顺序查找高得多。可以证明,对于长度 为 n 的有序线性表,在最坏情况下,二分 查找只需要比较 log 2 n 次,而顺序查找需 要比较 n 次。
时间空间复杂度
算法效率的度量
• 算法执行时间需要通过依据该算法编制的 程序在计算机上运行时所消耗的时间来度 量。而度量一个程序的执行时间通常有两 种方法:
事后统计的方法
• 可以利用计算机的内部计时功能,先把程 序编写好运行一下进行计时。不过这种方 法有两个缺陷:
• 一是必须先编制好程序并运行; • 二是所得出的时间统计量依赖于计算机的