数据结构——二叉搜索树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉搜索树查找操作
•分割式查找法:
•若根结点的关键码等于查找的关键码,成功。
•否则,若小于根结点的关键码,查其左子树。 大于根结点的关键码,查其右子树。
二叉搜索树的高效率在于继续检索时只需要查找两棵子树之一
7/84
二叉搜索树查找操作
如何查找元素 5 ?
13 8 5 5 5 18 查找成功! 5 23 37
二叉树与树
30/66 30/84
左单旋转
B h A C D h E h B h
A
C D h E h+1 B A
C E D h
h
h+1
初始状态
插入后失衡
调整后平衡
31/84 31
右单旋转
A B D h E h C h B D h+1 E h A C h D B
h+1
E
h
A
C
h
初始状态
插入后失衡
调整后平衡
• 向一棵高度平衡的AVL树中插入一个新 结点时,如果树中某个结点的平衡因子 的绝对值|balance|>1,则出现了不平衡, 需要做平衡化处理。
二叉树与树
35/66 35/84
平衡二叉搜索树插入操作举例
16
0
向AVL树中插入{16,3,7,11,9,26,18,14,15}的调整过程:
0
16
-1
3/84
二叉搜索树
一棵非空的二叉搜索树满足以下特征:
1. 每个结点都有一个作为搜索依据的关键码,所有 结点的关键码互不相同。 2. 左子树(如果存在)上的所有结点的关键码均小 于根结点的关键码。
3. 右子树(如果存在)上的所有结点的关键码均大 于根结点的关键码。
4. 根结点的左右子树也都是二叉搜索树。
二叉树与树
37/66 37/84
书面作业
• 132页:4,5,6,7,13 • 376页:15,18
38/84
2
6
在合并删除后,树的高度降低
19/84
复制删除
• 要删除的节点有两个子节点——通过复 制进行删除
– 选取“替身”取代被删结点。
• 如何选择? • 左子树中最大的结点或 右子树中最小的结点。
20/84
复制删除
将替身的数据场复制到被删结点的数据场。 删除值为122的结点。 被删结点
122
99 250 400 400
10/84
二叉搜索树插入操作
利用插入操作可以构造一棵二叉搜索树 首先给出结点序列:
13、8、23、5、18、37
Φ13
8 5 5 18
83 18 5 2 37 23 37 37 18
11/84
二叉搜索树插入操作(另一个例子)
• 对于关键码集合 K = {50,19,35,55,20,5,100,52,88,53,92} 二叉搜索树的生成过程如图所示:
450
500 99
110 250
450 500
替 身
110
105
200
300
330
105
200
300 330
21/84
复制删除
将替身的数据场复制到被删结点的数据场。 删除值为122的结点。 被删结点 122 400 450 200 400 450 250 300 330
22/84
99
110
250
200 300 替 身
二叉树与树 27/66 27/84
AVL树结点的插入
• 插入与BST一样
• 需要调整 • 相应子树的根结点变化大致有三类
–结点原来是平衡的,现在成为左重或右重的 • 修改相应前驱结点的平衡因子 –结点原来是某一边重的,而现在成为平衡的了 • 树的高度未变,不修改 –结点原来就是左重或右重的,而新结点又加到重的 一边 • 不平衡 • “危急结点”
二叉树与树 28/66 28/84
–新结点作叶结点
恢复平衡
0 10
-1
1 10
1 -1
0 3
8
12 15 0
0 3
8
2
12
15
1
17
0 10
-1 0
0
插入17后导致不平衡
0 3
8
0 12
15 17
0
二叉树与树 29/66 29/84
重新调整为平衡结构
AVL树结构调整
• • • • 左单旋转 右单旋转 先左后右旋转 先右后左旋转
50 19 52 55
5
20
35
100
53
88 92
12/84
• 对二叉搜索树的检索,每一次只需与结点的一棵 子树相比较 • 在执行插入操作时,也不必像在有序线性表中插 入元素那样要移动大量的数据,而只需改动某个 结点的空指针插入一个叶结点即可 • 与查找结点的操作一样,插入一个新结点操作的 时间复杂度是根到插入位置的路径长度,因此在 树形比较平衡时二叉搜索树的效率相当高
32/84 32
A
先左后右旋转
C h
A B F h E E G h-1 C h
B
初 始 状 态
D
h
F h-1
E G h-1 A
最插 D 点近入 为的失 h 失衡 衡,
C
A
围 子绕
E
B D h F h G h-1
h
围 绕 D A 右 h 旋
B F G
A C h-1
33/84 33
A B
左的 旋做 孩
1
16
-2
左右双旋
7 3
0
0
0
3
3
2
0
16
1
0
7
1
7
3
0
16
-1
0
7
7Leabharlann Baidu
16
-2
右单旋
3
3
0 0
11
0 0
11
0
11
9
-1
9
16
36/84 36
课堂练习
• 假定一组数据对象为(40,28,16,56, 50,32,30,63),按次序插入每个对 象生成一棵高度平衡的二叉搜索树。给 出插入各结点后的树的形状。
h
h
先右后左旋转
A
B
A
C E h
初 始 h D F G 状 态 h-1 h-1
A B
最插 点近入 h D 的失 为 F 失衡 h-1 衡,
D
B
C E G h h
A
围 绕h 子 右的 旋右 孩
D
F h-1 h G C
h
围 绕 B E左 h 旋 A
A
F h-1 G
C E h
34/84 34
A C
h
AVL树的插入
5 二叉树
1/84
主要内容
• 5.1 二叉树的概念 • 5.2 二叉树的周游 • 5.3 • 5.4 二叉树的存储结构 二叉搜索树
• 5.5 堆与优先队列 • 5.6 Huffman树及其应用 • 5.7 二叉树知识点总结
2/84
二叉搜索树
• 二叉搜索树
二叉搜索树的查找 二叉搜索树的插入操作 二叉搜索树的删除操作
二叉搜索树又称为“二叉排序树”、“二叉查找树”、“二叉检索树”
二叉搜索树举例
122 99 110 105 250 200 230 216 300
L C E M N P Y
是二叉搜索树 60 40 70
是二叉搜索树
50
55
80
5/84
不是二叉搜索树
二叉搜索树的基本操作
• 查找 • 插入 • 删除
6/84
500
99
110
500
105
330
105
内容提要
• • • • 5.4二叉搜索树BST 12.4.2 平衡的二叉搜索树 5.5堆与优先队列 5.6哈夫曼树及其应用
二叉树与树
23/84
平衡的二叉搜索树(AVL)
• BST受输入顺序影响
– 最好O(log n) – 最坏O(n)
输 入 顺 序 为 4 、 5 、 6 、 7、 8
4 5 6 7 8
• 怎样使得BST始终保持O(log n)级的平 衡状态? • Adelson-Velskii和Landis发明了AVL树
– 一种平衡的二叉搜索树 – 任何结点的左子树和右子树高度最多相差1
输 入 顺 序 为 7 、 5、 4、 6、 8 7 5 4 6 8
24/84
AVL树的性质
8/84
二叉搜索树查找分析——平均情况分析
50 20 15 30 60 70 15
20
30 50 60 70
ASL=(1+2+2+3+3+3)/6=14/6
ASL=(1+2+3+4+5+6)/6=21/6
9/84
二叉搜索树插入操作
• 首先执行查找算法,找出被插结点的父亲结点。 • 判断被插结点是其父亲结点的左、右儿子。将被插 结点作为叶子结点插入。 • 若二叉树为空。则首先单独生成根结点。 注意:新插入的结点总是叶子结点。
400 400
被删结点
99
122
250
450
500 110
122
250
450 500
110
105
200
300
105
200
300
230
230
15/84
二叉搜索树删除操作情况3
• 要删除的节点有两个子节点
– 合并删除 – 通过复制进行删除
16/84
合并删除
• 要删除的节点有两个子节点——合并删 除
root
node
node->left node->left node->right
root
node->right 左子树中最右 侧的节点
17/84
合并删除
15 10 30 11 20 40 删除node15 5 11 12 30
10
5
12
在合并删除后,树的高度增加
20
40
18/84
合并删除
15 10 5 20 30 删除node15 40 2 6 20 40 5 10 30
• 可以为空 • 具有n个结点的AVL树,高度为O(log n) • 如果T是一棵AVL树
–那么它的左右子树TL、TR也是AVL树 –并且| hL-hR|≤1 • hL、hR 是它的左右子树的高度
二叉树与树
25/66 25/84
二叉树与树
26/66 26/84
平衡因子
• 平衡因子,用bf(x)来表示结点x的平衡因子。它 被定义为: bf(x)= x的右子树的高度 – x的左子树的高度 • 对于一个AVL树中的结点平衡因子之可能取值 为0,1和-1 19 -1 -1 8 12 0 0 1 3 10 15 0 11
13/84
二叉搜索树删除操作情况1
• 叶子结点:直接删除,更改它的父亲结点的相应指针场为空。
•如:删除值为 15、70 的结点。
50 20 15 30 60 70 50 20 30 60
• 子树的根结点:若被删结点的左儿子为空或者右儿子为空。 如何处理呢?
14/84
二叉搜索树删除操作情况2
•子树的根结点:若被删结点的左儿子为空或者右儿子为空。 如删除结点的关键值为 99 结点。