二叉排序树查找算法

合集下载

二叉排序树

二叉排序树

9
第9章
第三节
二、二叉排序树(插入)

查找
动态查找表
二叉排序树是一种动态查找表


当树中不存在查找的结点时,作插入操作
新插入的结点一定是叶子结点(只需改动一个 结点的指针) 该叶子结点是查找不成功时路径上访问的最后 一个结点的左孩子或右孩子(新结点值小于或 大于该结点值) 10

第9章
第三节
查找
19
在二叉排序树中查找关 键字值等于37,88,94
3
第9章
第三节
查找
动态查找表
二、二叉排序树(查找函数)中结点结构定义 二叉排序树通常采用二叉链表的形式进行存 储,其结点结构定义如下:
typedef struct BiNode { int data; BiNode *lChild, *rChild; }BiNode,*BitTree;
4
第9章
第三节
查找
动态查找表
2、二叉排序树的定义 定义二叉排序树所有用到的变量 BitTree root; int
//查找是否成功(1--成功,0--不成功) //查找位置(表示在BisCount层中的第几个位置
BisSuccess;
int
int
BisPos;
BisCount;
//查找次数(相当于树的层数)
7
第9章
第三节
查找
动态查找表
二、二叉排序树(查找函数)
else { BisSuccess = 0; root=GetNode(k);//查找不成功,插入新的结点}
} BiNode * GetNode(int k) { BiNode *s; s = new BiNode; s->data = k; s->lChild = NULL; s->rChild = NULL; return(s);}

二叉排序树

二叉排序树

②若*p结点只有左子树,或只有右子树,则可将*p的左子 树或右子树直接改为其双亲结点*f的左子树,即: f->1child=p->1child(或f->1child=p->rchild); free(p); *f
F *p P P1
*f
F
*f
F *p P
*f
F
Pr
P1
Pr
③若*p既有左子树,又有右子树。则:
-1 0
47
-1
47
47
0
31 69
69
25
0
47
0
25
0
47
-1 0
31
0
69
0
40
69
40
69
0
25 76
40
76
(a)
AL、BL、BR 都是空树
(b) AL、BL、BR 都是非空树
LR型调整操作示意图
2
A
-1
0
C
AR C BL CL CR AR
0 0
B BL CL S
B
A
CR
(a) 插入结点*s后失去平衡
31
0 0 -1
31
0 1
28
0
25
0 0
47
0
25
-1
47
0
25
0
31
0
16 0
28
16
28
0
16 30
30
47
(c) LR(R)型调整
RL型调整操作示意图
A B C A BR CR B BR
AL
C
AL
CL CR

五种查找算法总结

五种查找算法总结

五种查找算法总结一、顺序查找条件:无序或有序队列。

原理:按顺序比较每个元素,直到找到关键字为止。

时间复杂度:O(n)二、二分查找(折半查找)条件:有序数组原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

时间复杂度:O(logn)三、二叉排序树查找条件:先创建二叉排序树:1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 它的左、右子树也分别为二叉排序树。

原理:在二叉查找树b中查找x的过程为:1. 若b是空树,则搜索失败,否则:2. 若x等于b的根节点的数据域之值,则查找成功;否则:3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:4. 查找右子树。

时间复杂度:四、哈希表法(散列表)条件:先创建哈希表(散列表)原理:根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。

时间复杂度:几乎是O(1),取决于产生冲突的多少。

五、分块查找原理:将n个数据元素"按块有序"划分为m块(m ≤ n)。

每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……。

然后使用二分查找及顺序查找。

数据结构 二叉排序树

数据结构 二叉排序树

9.6.2 哈希函数的构造方法
构造哈希函数的目标:
哈希地址尽可能均匀分布在表空间上——均 匀性好; 哈希地址计算尽量简单。
考虑因素:
函数的复杂度; 关键字长度与表长的关系; 关键字分布情况; 元素的查找频率。
一、直接地址法 取关键字或关键字的某个线性函数值为哈希地址 即: H(key) = key 或: H(key) = a* key + b 其中,a, b为常数。 例:1949年后出生的人口调查表,关键字是年份 年份 1949 1950 1951 … 人数 … … … …
9.4 二叉排序树
1.定义:
二叉排序树(二叉搜索树或二叉查找树) 或者是一棵空树;或者是具有如下特性的二叉树
(1) 若它的左子树不空,则左子树上所有结点的 值均小于根结点的值;
(2) 若它的右子树不空,则右子树上所有结点 的值均大于等于根结点的值; (3) 它的左、右子树也都分别是二叉排序树。
例如:
H(key)
通常设定一个一维数组空间存储记录集合,则 H(key)指示数组中的下标。
称这个一维数组为哈希(Hash)表或散列表。 称映射函数 H 为哈希函数。 H(key)为哈希地址
例:假定一个线性表为: A = (18,75,60,43,54,90,46) 假定选取的哈希函数为
hash3(key) = key % 13
H(key) = key + (-1948) 此法仅适合于: 地址集合的大小 = = 关键字集合的大小
二、数字分析法
假设关键字集合中的每个关键字都是由 s 位数 字组成 (u1, u2, …, us),分析关键字集中的全体, 并从中提取分布均匀的若干位或它们的组合作为 地址。 例如:有若干记录,关键字为 8 位十进制数, 假设哈希表的表长为100, 对关键字进行分析, 取随机性较好的两位十进制数作为哈希地址。

二叉排序树

二叉排序树

二叉排序树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,…。

二叉排序树

二叉排序树

就维护表的有序性而言,二叉排序树无须移 动结点,只需修改指针即可完成插入和删 除操作,且其平均的执行时间均为O(lgn), 因此更有效。二分查找所涉及的有序表是 一个向量,若有插入和删除结点的操作, 则维护表的有序性所花的代价是O(n)。当 有序表是静态查找表时,宜用向量作为其 存储结构,而采用二分查找实现其查找操 作;若有序表里动态查找表,则应选择二 叉排序树作为其存储结构。
if(q->lchild) //*q的左子树非空,找*q的左子 树的最右节点r. {for(q=q->lchild;q->rchild;q=q->rchild); q->rchild=p->rchild; } if(parent->lchild==p)parent->lchild=p>lchild; else parent->rchild=p->lchild; free(p); /释放*p占用的空间 } //DelBSTNode
下图(a)所示的树,是按如下插入次序构成的: 45,24,55,12,37,53,60,28,40,70 下图(b)所示的树,是按如下插入次序构成的: 12,24,28,37,40,45,53,55,60,70
在二叉排序树上进行查找时的平均查找长度和二叉树的形态 有关: ①在最坏情况下,二叉排序树是通过把一个有序表的n 个结点依次插入而生成的,此时所得的二叉排序树蜕化为 棵深度为n的单支树,它的平均查找长度和单链表上的顺 序查找相同,亦是(n+1)/2。 ②在最好情况下,二叉排序树在生成的过程中,树的形 态比较匀称,最终得到的是一棵形态与二分查找的判定树 相似的二叉排序树,此时它的平均查找长度大约是lgn。 ③插入、删除和查找算法的时间复杂度均为O(lgn)。 (3)二叉排序树和二分查找的比较 就平均时间性能而言,二叉排序树上的查找和二分查找 差不多。

KdTree算法详解

KdTree算法详解

KdTree算法详解kd树(k-dimensional树的简称),是⼀种分割k维数据空间的数据结构,主要应⽤于多维空间关键数据的近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor)。

⼀、Kd-tree其实KDTree就是⼆叉查找树(Binary Search Tree,BST)的变种。

⼆叉查找树的性质如下:1)若它的左⼦树不为空,则左⼦树上所有结点的值均⼩于它的根结点的值;2)若它的右⼦树不为空,则右⼦树上所有结点的值均⼤于它的根结点的值;3)它的左、右⼦树也分别为⼆叉排序树;例如:如果我们要处理的对象集合是⼀个K维空间中的数据集,我们⾸先需要确定是:怎样将⼀个K维数据划分到左⼦树或右⼦树?在构造1维BST树类似,只不过对于Kd树,在当前节点的⽐较并不是通过对K维数据进⾏整体的⽐较,⽽是选择某⼀个维度d,然后⽐较两个K维数据在该维度 d上的⼤⼩关系,即每次选择⼀个维度d来对K维数据进⾏划分,相当于⽤⼀个垂直于该维度d的超平⾯将K维数据空间⼀分为⼆,平⾯⼀边的所有K维数据在d维度上的值⼩于平⾯另⼀边的所有K维数据对应维度上的值。

也就是说,我们每选择⼀个维度进⾏如上的划分,就会将K维数据空间划分为两个部分,如果我们继续分别对这两个⼦K维空间进⾏如上的划分,⼜会得到新的⼦空间,对新的⼦空间⼜继续划分,重复以上过程直到每个⼦空间都不能再划分为⽌。

以上就是构造 Kd-Tree的过程,上述过程中涉及到两个重要的问题:1. 每次对⼦空间的划分时,怎样确定在哪个维度上进⾏划分;2. 在某个维度上进⾏划分时,怎样确保建⽴的树尽量地平衡,树越平衡代表着分割得越平均,搜索的时间也就是越少。

1、在哪个维度上进⾏划分?⼀种选取轴点的策略是median of the most spread dimension pivoting strategy,统计样本在每个维度上的数据⽅差,挑选出对应⽅差最⼤值的那个维度。

几种查找算法的比较

几种查找算法的比较

w i ( r n.e!= ) hl c r t y n{ eue k
++r :
in cret e) f <urn. y{ ( k
es( cr n= urn.gt le u e tcr tih; e r
的结点放在前边 , 以提高查找效率 , 代码描述如下 :
pbi casC aho{ u l ls h za c p bi t h n uit , t ) u l i u X ( i  ̄a{ cn s n nn
p o rm ’ o e ae i jv ec mpid T i o lxt nds a ec mpe i olo o e smed t r o ae rga Sc d sb sd Ol a aa o l . het r e mec mp e i a p c o lxt t o kfrt a aaaec mp rd. y y h
【 ywod ]erhn ; grh Tmecm lxt;p c o l i Ke r sSac igAl i m;i o pe i S aecm3 二 叉 排 序 树 查 找
数 据 地 修改 、 除 、 入 等 操 作 都 是 基 于 查 找 算 法 的 , 删 插 因此 比较 查 实 际 上 就 是 将 数 据元 素组 织 成 二 叉 树 形 式 , 达 到 与 二 分 法 相 同 以 找 算 法 的 优 劣 , 择 正 确 的查 找 算 法 能 够 极 大 地 提 高 用 户 对 数 据 的查 的查 找 效 率 , 又 具 有链 表 的插 入 、 除 操 作 的 灵 活 性 。 二叉 排 序 树 选 而 删 用 找 ; 而 提高 了计 算 机 软 件 的工 作 效 率 。 查 找 是 在 大 量 的 信 息 中寻 找 实现 的算法的平均时间复杂度是 Onon 。最佳状态的时间复杂度为 从 (ls) 个 特定 的信 息 元 素 , 计 算 机 应 用 中 , 找 是 常 用 的 基 本 运 算 , 找 1 即第 一 次就 找 到 数据 , 坏 状 态 的 时 间 复 杂 度 为 non即 未 能 找 到 在 查 查 , 最 lg,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*否则指针p指向查找路径上访问的最后一个结点并返回false*/
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
if(!T)//查找不成功
{
*p = f;
return false;
} else if(key == T->data)//查找成功
{
*p = T;
return true;
}else if(key < T->data)
return SearchBST(T->lchild,key,T,p);//在左子树继续查找
else
return SearchBST(找
}
二叉排序树(二叉查找树):是一颗空树或者具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点值均小于他的根结构的值;
若它的右子树不空,则右子树上所有结点值均大于它的根结构的值
它的左右子树也都是二叉排序树
二叉树的二叉链表结点结构定义:
/*二叉树的二叉链表节点结构定义*/
typedef struct BiTNode//节点结构
{
int data;//节点数据
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BTree;
二叉排序树的查找算法实现:
/*递归查找二叉排序树T中是否存在key*/
/*指针f指向T的双亲,其初始调用值为NULL*/
/*若查找成功,则指针p指向该数据元素节点,并返回true*/
相关文档
最新文档