二叉排序树
二叉排序树

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);}
二叉树基本知识

{
int capacity;
int size;
int *elements;
}*tryit;
struct priorityqueue *initialize ( int maxelements )
{
struct priorityqueue *h;
(6)给定N个节点,能构成h(N)种不同的二叉树。
h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n+1)。
4.二叉树的存储结构
(1)顺序存储方式
type node=record
Байду номын сангаасata:datatype
l,r:integer;
end;
var tr:array[1..n] of node;
(1)前序遍历
访问根;按前序遍历左子树;按前序遍历右子树
(2)中序遍历
按中序遍历左子树;访问根;按中序遍历右子树
(3)后序遍历
按后序遍历左子树;按后序遍历右子树;访问根
(4)层次遍历
即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同)
(2)链表存储方式,如:
type btree=^node;
node=record
data:datatye;
lchild,rchild:btree;
end;
5.普通树转换成二叉树
二叉树很象一株倒悬着的树,从树根到大分枝、小分枝、直到叶子把数据联系起来,这种数据结构就叫做树结构,简称树。树中每个分叉点称为结点,起始结点称为树根,任意两个结点间的连接关系称为树枝,结点下面不再有分枝称为树叶。结点的前趋结点称为该结点的"双亲",结点的后趋结点称为该结点的"子女"或"孩子",同一结点的"子女"之间互称"兄弟"。
二叉排序树

②若*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
数据结构 二叉排序树

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,…。
详解平衡二叉树

一、平衡二叉树的概念平衡二叉树(Balanced binary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)于1962年首先提出的,所以又称为AVL树。
定义:平衡二叉树或为空树,或为如下性质的二叉排序树:(1)左右子树深度之差的绝对值不超过1;(2)左右子树仍然为平衡二叉树.平衡因子BF=左子树深度-右子树深度.平衡二叉树每个结点的平衡因子只能是1,0,-1。
若其绝对值超过1,则该二叉排序树就是不平衡的。
如图所示为平衡树和非平衡树示意图:二、平衡二叉树算法思想若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。
首先要找出插入新结点后失去平衡的最小子树根结点的指针。
然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。
当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。
失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。
假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。
1)LL型平衡旋转法由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。
故需进行一次顺时针旋转操作。
即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。
而原来B的右子树则变成A的左子树。
(2)RR型平衡旋转法由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。
故需进行一次逆时针旋转操作。
即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。
而原来C的左子树则变成A的右子树。
(3)LR型平衡旋转法由于在A的左孩子B的右子数上插入结点F,使A的平衡因子由1增至2而失去平衡。
故需进行两次旋转操作(先逆时针,后顺时针)。
即先将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。
(完整word版)特殊二叉树

第6章 特殊二叉树6.1 二叉搜索树6.1。
1 二叉搜索的定义二叉搜索树(Binary Sort Tree )又称二叉排序树(Binany Search Tree ),它或者是一棵空树,或者是一棵具有如下特性的非空二叉树: (1) 若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字;(2) 若它的右子树非空,则右子树上所有结点的关键字均大于(若允许具有相同的关键字的结点存在,则大于等于)根结点的关键字; (3) 左、右子树本身又各是一棵二叉搜索树。
在树中当每个结点的元素类型为简单类型时,则结点的关键字就是该结点的值,当每个结点的元素类型为记录类型时,则结点的关键字为该结点的某一个域的值。
对搜索树进行中序遍历得到的结点序列是一个有序序列。
该图的中序遍历得到的结点序列是: 12,15,18,23,26,30,52,63,743015527412236318266。
1。
2 二叉搜索树的抽象数据类型搜索树的抽象数据类型中的数据部分:是具有链接存储结构;操作部分除了已经讨论过的对一般树的操作外,还具有查找、更新、插入和删除元素的操作。
假定搜索树中的结点类型为BTreeNode,指向树的根结点指针为BST,则对搜索树BST的查找、更新、插入和删除元素的操作定义如下:int Find(BTreeNode *BST, ElemType &item);//从搜索树中查找等于给定值item的元素,若查找成功则返回真,并由item返回该元素的值,否则返回假;int Update(BTreeNode * BST,const ElemType &item);// 从二叉搜索树中查找等于给定值item的元素,若查找成功则用item的值重写该元素的值并返回真,否则返回假;void lnsert(BTreeNode *&BST,const ElemType &item);// 按item的大小向搜索树中插入一个元素item,使得插入后仍是一棵搜索树;int Delete(BTreeNode *&BST, const ElemType &item)// 从二叉搜索树中删除值为item的第一个结点,若删除成功则返回1, 否则返回0;下面分别对这四种运算进行讨论.6。
数据结构之二叉树(BinaryTree)

数据结构之⼆叉树(BinaryTree)⽬录导读 ⼆叉树是⼀种很常见的数据结构,但要注意的是,⼆叉树并不是树的特殊情况,⼆叉树与树是两种不⼀样的数据结构。
⽬录 ⼀、⼆叉树的定义 ⼆、⼆叉树为何不是特殊的树 三、⼆叉树的五种基本形态 四、⼆叉树相关术语 五、⼆叉树的主要性质(6个) 六、⼆叉树的存储结构(2种) 七、⼆叉树的遍历算法(4种) ⼋、⼆叉树的基本应⽤:⼆叉排序树、平衡⼆叉树、赫夫曼树及赫夫曼编码⼀、⼆叉树的定义 如果你知道树的定义(有限个结点组成的具有层次关系的集合),那么就很好理解⼆叉树了。
定义:⼆叉树是n(n≥0)个结点的有限集,⼆叉树是每个结点最多有两个⼦树的树结构,它由⼀个根结点及左⼦树和右⼦树组成。
(这⾥的左⼦树和右⼦树也是⼆叉树)。
值得注意的是,⼆叉树和“度⾄多为2的有序树”⼏乎⼀样,但,⼆叉树不是树的特殊情形。
具体分析如下⼆、⼆叉树为何不是特殊的树 1、⼆叉树与⽆序树不同 ⼆叉树的⼦树有左右之分,不能颠倒。
⽆序树的⼦树⽆左右之分。
2、⼆叉树与有序树也不同(关键) 当有序树有两个⼦树时,确实可以看做⼀颗⼆叉树,但当只有⼀个⼦树时,就没有了左右之分,如图所⽰:三、⼆叉树的五种基本状态四、⼆叉树相关术语是满⼆叉树;⽽国际定义为,不存在度为1的结点,即结点的度要么为2要么为0,这样的⼆叉树就称为满⼆叉树。
这两种概念完全不同,既然在国内,我们就默认第⼀种定义就好)。
完全⼆叉树:如果将⼀颗深度为K的⼆叉树按从上到下、从左到右的顺序进⾏编号,如果各结点的编号与深度为K的满⼆叉树相同位置的编号完全对应,那么这就是⼀颗完全⼆叉树。
如图所⽰:五、⼆叉树的主要性质 ⼆叉树的性质是基于它的结构⽽得来的,这些性质不必死记,使⽤到再查询或者⾃⼰根据⼆叉树结构进⾏推理即可。
性质1:⾮空⼆叉树的叶⼦结点数等于双分⽀结点数加1。
证明:设⼆叉树的叶⼦结点数为X,单分⽀结点数为Y,双分⽀结点数为Z。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– 插入算法
例 {10, 18, 3, 8, 12, 2, 7, 3}
10
10
10
10
10
18
3
18
3 8
18
3
18
8 12
10 3 2 18 8 12 2 7 3
10 18 8 12 2 7 3 3
10 18 8 12
中序遍历二叉排序树可得到一个关键字的有序序列
2013-7-26
2013-7-26
(4) RL型调整
由于在*a的右子树根节点的左子树上插入接点,*a的平衡因子由-1 变为-2,致使以*a为根的子树失去平衡,需要进行两次旋转操作 (先右后左)。—(RL型) RL型调整规则: 设C为A的右子女的左子女,将A的孙子结点C提升为新二叉树的根, 原来C的父结点B连同其右子树δ向右下旋转成为新根C的右子树,C 的原右子树γ成为B的左子树;原来的根A连同其左子树α向左下旋 转成为新根C的左子树,原来C的左子树β成为A的右子树。
12 45 24 12 37 53 93 93 24 37 45
53
ASL=(1+2*2+3*3)/6=14/6
ASL=(1+2+3+4+5+6)/6=21/6
含有n个节点的二叉排序树的平均查找长度和树的形 态有关。
若插入的关键字有序时,构成的二叉排序树蜕变成单 支树,其平均查找长度为(n+1)/2。
关键字 集合
hash
存储地址 集合
2013-7-26
• 哈希表——应用哈希函数,由记录的关键字确定记录 在表中的地址,并将记录放入此地址。该表叫~ • 哈希查找——又叫散列查找,利用哈希函数进行查找 的过程叫~
例1 30个地区的各民族人口统计表
编号 1 2 …... 地区别 北京 上海 …... 以地区别作关键字,取地区 名称第一个拼音字母的序号 作哈希函数:H(Beijing)=2 H(Shanghai)=19 H(Shenyang)=19 总人口 汉族 回族…...
有关键字序列(13,24,37,90,53),生成平衡二 叉树:
空 (a) 0 13 -1 13 0 24 0 24 0 13
2013-7-26
-2 13 -1 24 0 37 0 37
-1 24
0 13
-1 37
-2 24
0 90
(1)
0 13
-2 37
-1 53
(3)
0 90
-2 24 0 13 -2 37 1 90 0 53 0 13
最好的情况为二叉排序树的形态和折半查找的判定树 相同,其平均查找长度和log2n成正比。 要想使任何的关键字的集合构成的二叉排序树的平均 查找长度均达到log2n数量级,需对二叉排序树进行“ 平衡化”处理,成为平衡二叉树。
2013-7-26
平衡二叉树—AVL树
平衡二叉树或者是一棵空树,或者具有以下性质:
2013-7-26
(3) LR型调整
由于在*a的左子树根节点的右子树上插入接点,*a的平衡因子 由1变为2,致使以*a为根的子树失去平衡,需要进行两次旋转操作 (先左后右)。—(LR型) LR型调整规则: 设C为A的左子女的右子女,将A的孙子结点C提升为新二叉树的根; 原C的父结点B连同其左子树α向左下旋转成为新根C的左子树,原C 的左子树β成为B的右子树;原根A连同其右子树δ向右下旋转成为 新根C的右子树,原C的右子树γ成为A的左子树。
S
Q PL 中序遍历:Q S PL P P
S
Q P
中序遍历:Q S PL (2)
2013-7-26
第二种情况: – p只有左子树或右子树 »p只有左子树,用p的左孩子代替p »p只有右子树,用p的右孩子代替p »情况见图(3)(4)
2013-7-26
S P PL 中序遍历:PL P S Q Q PL
150
70
150
53
10
53
8
4
8 13 5 4
2013-7-26
25
删除10
8 25 删除5
4 4 13 25
4
5 13
4
二叉排序树的查找分析 在二叉树上查找一个关键字的过程,恰是走了一 条从根节点到该节点的路径,因此与给定值比较的 次数不超过树的深度。
对相同数的集合构成的二叉排序树因为根节点不 同而造成平均查找长度不同。
2013-7-26
如:输入关键字序列{16,3,7,11,9,26,18,14,15},给出构 造一棵AVL树的步骤。
2 0 16 0 3 1 16 -1 3 0 7 0 3 16 0 7 0 16 0 3 0 11 (d)LR 调整 -2 -1 2 16 1 11 0 9 (f)插入 9
2013-7-26
2013-7-26
– 哈希函数的构造方法
直接定址法 – 方法:取关键字或关键字的某个线性函数作哈希地址。 H(key)=key 或 H(key)=a· key+b – 特点: »直接定址法所得地址集合与关键字集合大小相等, 不会发生冲突。若有冲突,说明关键字错误。 »实际中能用这种哈希函数的情况很少 »适用于关键字分布基本连续的情况。若不连续, 空号较多,将造成存储空间的严重浪费。
Байду номын сангаас
当对该表检索时,只需用给定关键字值k通过这个函数计算出地 址,以该地址从检索表的对应位置取出记录的有关信息即可, 不需要进行关键字值的比较操作。 如检索key=57的记录,通过h(57)=57%13=5知关键字值为57的 记录在检索表的存储位置5处,从而得到关键字值为57的记录的 有关信息。
2013-7-26
-1 0 -2 16 1 26 0 3 0 7 0 9 0 16 11 0 18 0 26 0 3 0 7 0 9 0 14 (k)RL 调整 (l)插入 14 1 16 11 1 18 0 26
2 18 2 16 0 26 0 3 0 0 7 0 9
11 -1 1 18 0 15 16 0 26 0
左子树和右子树的深度之差的绝对值不超过1;
它的左子树和右子树又分别是平衡二叉树。
二叉树节点的平衡因子BF:该节点的左子树深度减去 右子树的深度。 BF—Balance Factor 所以平衡二叉树的平衡因子只可能为-1,0,1。否则不 能成为平衡二叉树。
2013-7-26
下面举例说明构成平衡二叉树的过程:
2013-7-26
第三种情况: – p左、右子树均非空 »沿p左子树的根C的右子树分支找到S,S 的右子树为空,将S的左子树成为S的双 亲Q的右子树,用S取代p (5) »若C无右子树,用C取代p (6)
2013-7-26
中序遍历:CL C ……QL Q SL S P PR F F P C CL QL SL F P C CL 中序遍历:CL C P PR F (6)
2013-7-26
(2) RR型调整
由于在*a的右子树根节点的右子树上插入接点,*a的平衡因子 由-1变为-2,致使以*a为根的子树失去平衡,需要进行一次向 左的逆时针旋转操作。—(RR型) RR型调整规则: 将A的右子树B提升为新二叉树的根;原来的根A连同其左子树 向左下旋转成为B的左子树;B的原左子树作为A的右子树。
2013-7-26
从例子可见: – 哈希函数只是一种映象,所以哈希函数的设定很灵活,只 要使任何关键字的哈希函数值都落在表长允许的范围之内 即可 – 冲突:key1key2,但H(key1)=H(key2)的现象 – 同义词:具有相同函数值的两个关键字,叫该哈希函数的 – 哈希函数通常是一种压缩映象,所以冲突不可避免,只能 尽量减少;同时,冲突发生后,应该有处理冲突的方法 – 产生散列冲突相关的主要因素: 装填因子:散列表中已存入元素n与散列表空间大小m的比。 装填因子越小,产生的冲突就越小;否则,就越大。 散列函数 散列函数选择适当,使散列地址尽可能均匀地分布在散列 空间中,产生的冲突就少;否则,就大。 冲突的解决方法
-1 7 1 16
(a)插入 16 -2 7 0 3
(b)插入 3
(c)插入 7
(e)插入 11 0 11
7 0 3 0 11 0 0 16 (h)插入 26 9 -1 11 -1 16 0 26 0 3 0 7
7 0 3 0 9 (g)LL 调整
-1 16 0 9 0 26
(i)RR 调整
-1 11 0 7 0 3 0 9 0 18 (j)插入 18 11 -2 0 7 0 3 0 9 -1 14 0 15 (m)插入 15
动态查找表
动态查找表的特点:表结构本身是在查找过程 中动态生成的,即对于给定值key,若表中存在其 关键字等于key的纪录,则返回查找成功,否则插 入关键字等于key的纪录。
本节主要介绍二叉排序树和平衡二叉树的有关 概念和查找分析
2013-7-26
二叉排序树
• 定义:二叉排序树或是一棵空树,或是具有下列性质 的二叉树: – 若它的左子树不空,则左子树上所有结点的值均 小于它的根结点的值 – 若它的右子树不空,则右子树上所有结点的值均 大于或等于它的根结点的值 – 它的左、右子树也分别为二叉排序树 • 二叉排序树的插入 – 插入原则:若二叉排序树为空,则插入结点应为 新的根结点;否则,继续在其左、右子树上查找, 直至某个结点的左子树或右子树为空为止,插入 结点应为该结点的左孩子或右孩子 – 二叉排序树生成:从空树出发,经过一系列的查 找、插入操作之后,可生成一棵二叉排序树
2013-7-26
F S
PR Q
C CL
PR Q QL SL
S
(5)
中序遍历:CL C ……QL Q SL S PR F F
C