Chapter 9 高度平衡二元搜寻树 AVL Binary Search Tree

合集下载

搜索树

搜索树

9/10/2012
30
9/10/2012
31
9/10/2012
32
高度不平衡的二叉搜索树 高度平衡的二叉搜索树
9/10/2012
33
平衡


当确定搜索树的高度总是O(logn)时, 能够保证每个搜索树操作所占用的时 间为O(logn)。 高度为O(logn)的树称为平衡树 (balanced tree)。
根据AVL树的定义,任一结点的平衡因子 只能取 -1,0和 1。 如果一个结点的平衡因子的绝对值大于1, 则这棵二叉搜索树就失去了平衡,不再 是AVL树。
如果一棵二叉搜索树是高度平衡的,它就 成为 AVL树。如果它有 n 个结点,其高 度可保持在O(log2n),平均搜索长度也可 保持在O(log2n)。
二叉搜索树的插入
插入新结点88 每次结点的插入,都要从根结点出发搜索插 入位置,然后把新结点作为叶结点插入。
9/10/2012 14
二叉搜索树的插入
9/10/2012
15
输入数据,建立二叉搜索树的过程
输入数据序列 { 53, 78, 65, 17, 87, 09, 81, 45, 23 }
9/10/2012
22
9/10/2012
9/10/2012
23
二叉搜索树的删除


如果p有两个非空子树。 只需将该元素替换为它的左子树中的 最大元素或右子树中的最小元素。
9/10/2012
249/10/201225二叉搜索树的删除


注意,必须确保右子树中的最小元素以及 左子树中的最大元素或者在没有子树的节 点中,或者在只有一个子树的节点中。 可以按下述方法来查找到左子树中的最大 元素:首先移动到子树的根,然后沿着各 节点的右孩子指针移动,直到右孩子指针 为0为止。 类似地,也可以找到右子树中的最小元素: 首先移动到子树的根,然后沿着各节点的 左孩子指针移动,直到左孩子指针为0为止。

数据结构与算法(5):AVL树

数据结构与算法(5):AVL树

平衡⼆二叉树(AVL树,发明者的姓名缩写):⼀一种⾼高度平衡的排序⼆二叉树,其每⼀一个节点的左⼦子树和右⼦子树的⾼高度差最多等于1。

平衡⼆二叉树⾸首先必须是⼀一棵⼆二叉排序树!平衡因⼦子(Balance Factor):将⼆二叉树上节点的左⼦子树深度减去右⼦子树深度的值。

对于平衡⼆二叉树所有包括分⽀支节点和叶节点的平衡因⼦子只可能是-1,0和1,只要有⼀一个节点的因⼦子不不在这三个值之内,该⼆二叉树就是不不平衡的。

最⼩小不不平衡⼦子树:距离插⼊入结点最近的,且平衡因⼦子的绝对值⼤大于1的节点为根的⼦子树。

n个结点的AVL树最⼤大深度约1.44log2n。

查找、插⼊入和删除在平均和最坏情况下都是O(logn)。

增加和删除可能需要通过⼀一次或多次树旋转来重新平衡这个树。

这个⽅方案很好的解决了了⼆二叉查找树退化成链表的问题,把插⼊入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。

但是频繁旋转会使插⼊入和删除牺牲掉O(logN)左右的时间,不不过相对⼆二叉查找树来说,时间上稳定了了很多。

可以采⽤用动态平衡技术保持⼀一个平衡⼆二叉树。

构造平衡⼆二叉树的时候,也可以采⽤用相同的⽅方法,默认初始时,是⼀一个空树,插⼊入节点时,通过动态平衡技术对⼆二叉树进⾏行行调整。

Adeleon-Velskii和Landis提出了了⼀一个动态地保持⼆二叉排序树平衡的⽅方法,其基本思想是:在构造⼆二叉排序树的过程中,每当插⼊入⼀一个结点时,⾸首先检查是否因插⼊入⽽而破坏了了树的平衡性,若是因插⼊入结点⽽而破坏了了树的平衡性,则找出其中最⼩小不不平衡树,在保持排序树特性的前提下,调整最⼩小不不平衡⼦子树各结点之间的连接关系,以达到新的平衡。

通常这样得到的平衡⼆二叉排序树简称为AVL树。

⾼高度差2。

容易易看出,这种不不平衡出现在下⾯面四种情况:为使树恢复平衡,我们把k2变成这棵树的根节点,因为k2⼤大于k1,把k2置于k1的右⼦子树上,⽽而原本在k1右⼦子树的Y⼤大于k1,⼩小于k2,就把Y置于k2的左⼦子树上,这样既满⾜足了了⼆二叉查找树的性质,⼜又满⾜足了了平衡⼆二叉树的性质。

数据结构树的种类

数据结构树的种类

数据结构树的种类树是一种基本的数据结构,用于表示具有层次结构的数据。

它由一组节点组成,其中的每个节点都可以有零个或多个子节点。

树可以有不同的种类,每种种类具有不同的特点和应用场景。

以下是一些常见的树的种类:1. 二叉树(Binary Tree):二叉树是一种每个节点最多只有两个子节点的树结构。

它可以是空树,或者由一个根节点、左子树和右子树组成。

二叉树具有简单的结构,常用于二分和排序。

2. 二叉树(Binary Search Tree):二叉树是一种具有以下特点的二叉树:左子树中的所有节点都比根节点小,右子树中的所有节点都比根节点大。

二叉树支持快速的查找、插入和删除操作,并在树中保持有序性。

3. 平衡二叉树(Balanced Binary Tree):平衡二叉树是一种二叉树,但它在插入和删除节点时会自动调整树的结构以保持树的平衡性。

平衡二叉树的常见实现包括 AVL 树和红黑树,它们可以提供在最坏情况下仍保持对数时间复杂度的查找、插入和删除操作。

4. B树(B-Tree):B树是一种自平衡的树结构,它具有以下特点:每个节点可以有多个子节点,每个节点中的键值有序排列,并且每个节点中的键值数量有一个上限和下限。

B树通常用于大规模数据的存储和数据库系统。

5. Trie树(Trie Tree):Trie树,也称为字典树或前缀树,是一种专门用于处理字符串集合的树结构。

Trie树的每个节点都代表一个字符串前缀,通过将字符逐级插入树中,可以高效地完成字符串的和查找操作。

6. 线段树(Segment Tree):线段树是一种用于处理区间查询问题的树结构。

它将要处理的区间划分为一系列离散的线段,并为每个线段创建一个节点。

线段树可以高效地回答关于区间的统计性质,如区间最小值、区间最大值、区间和等。

7. 堆(Heap):堆是一种完全二叉树,它具有以下特点:对于每个节点,它的值都大于等于(或小于等于)它的子节点的值。

堆被广泛应用于优先队列、排序算法(如堆排序)以及图算法中。

太空人平衡树的技巧-概述说明以及解释

太空人平衡树的技巧-概述说明以及解释

太空人平衡树的技巧-概述说明以及解释1.引言1.1 概述太空人平衡树是一种旨在解决二叉搜索树不平衡的问题的数据结构。

它通过使用节点的"权重"来调整树的结构,使得左子树和右子树的高度差尽量小,从而提供更快速的搜索和插入操作。

太空人平衡树的技巧是一套操作和策略,用于在实际应用中有效地构建和维护平衡的树结构。

这些技巧包括节点的旋转、子树的重建以及权重调整等操作。

通过旋转操作,太空人平衡树可以根据特定情况将节点进行左旋或右旋,从而重新构建树的结构。

这样,较高的子树可以通过旋转操作被转移到较低的位置,使得左子树和右子树的高度差得以减小。

另外,当进行插入或删除操作时,太空人平衡树会通过重建子树的方式来调整整个树的平衡。

这意味着,在插入或删除节点时,可能需要将一部分子树重新构建,以保持整个树的平衡状态。

权重调整是太空人平衡树中的一个重要操作,在插入或删除节点后,树的权重可能会发生变化。

通过适时地增加或减少节点的权重,太空人平衡树可以保持树的整体平衡,避免发生不平衡的情况。

总而言之,太空人平衡树的技巧是一种有效解决二叉搜索树不平衡问题的方法。

通过合理地运用节点旋转、子树重建以及权重调整等操作和策略,可以构建出一个高效、平衡的数据结构,提供更快速的搜索和插入操作。

在接下来的文章中,我们将详细介绍太空人平衡树的基本原理以及实际操作技巧。

1.2文章结构本文包括引言、正文和结论等3个子章节。

引言部分概述了太空人平衡树的技巧,并介绍了本文的目的。

正文部分分为两个部分,即基本原理和技巧讲解。

基本原理部分解释了太空人平衡树的基本原理,包括其数据结构和算法等方面的内容。

技巧讲解部分则介绍了太空人平衡树的实际操作技巧,包括如何构建太空人平衡树和应用中的注意事项等。

结论部分总结了太空人平衡树的技巧和应用,以及展望了其未来的发展方向。

通过本文的阅读,读者可以全面了解太空人平衡树的相关知识和在实际应用中的技巧。

1.3 目的本文的目的是探讨太空人平衡树的技巧及其应用。

18个查找函数 -回复

18个查找函数 -回复

18个查找函数-回复查找函数在计算机编程中是非常重要的工具,它们可以帮助我们在大量的数据中快速准确地找到所需的信息。

无论是对于数据分析、软件开发还是数据库管理,查找函数都是必不可少的。

本文将介绍18个常见的查找函数,并详细解释它们的功能和使用方法。

1. 线性查找(Linear Search)线性查找是最简单的一种查找方法,它从数据结构的一端开始逐个比较数据元素,直到找到目标元素或查找完整个数据结构。

如果数据结构是有序的,则可以使用二分查找等更高效的方法。

2. 二分查找(Binary Search)二分查找是一种针对有序数据结构的查找方法,它通过将待查找元素与数据中间位置的元素进行比较,从而将查找范围逐渐缩小一半,直到找到目标元素或确定不存在。

3. 插值查找(Interpolation Search)插值查找是一种改进的查找方法,它基于二分查找的思想,但是在选择比较元素时更加接近目标元素的位置。

这种方法适用于数据分布均匀的情况下,查找效率较高。

4. 哈希查找(Hash Search)哈希查找是一种基于哈希表实现的查找方法,它将关键字直接映射到哈希表的槽位上,从而能够在常数时间内快速定位目标元素。

这种方法适用于需要快速查找的场景。

5. 二叉查找树(Binary Search Tree)二叉查找树是一种经典的数据结构,它通过比较节点的值将数据分为左子树和右子树,并保持左子树节点的值小于根节点,右子树节点的值大于根节点。

在二叉查找树中进行查找操作时,可以根据节点值的大小关系选择下一步的查找方向。

6. 平衡二叉查找树(Balanced Binary Search Tree)平衡二叉查找树是在二叉查找树的基础上进行了平衡操作,以保持树的高度平衡,提高了查找的效率。

常见的平衡二叉查找树有红黑树和AVL树。

7. B树(B-Tree)B树是一种多路平衡查找树,它可以在每个节点中存储多个关键字和子节点,从而减少磁盘访问次数,提高查找效率。

平衡二叉树

平衡二叉树

构造二叉平衡(查找)树的方法是:
在插入过程中,采用平衡旋转技术。
例如:依次插入的关键字为5, 4, 2, 8, 6, 9
5 4 2
向右旋转 一次
4 2 5 8 2
4 6 5
先向右旋转 再向左旋转
8
6
向左旋转一次
4 2 5 6 8 9 4 6 8 5 9
继续插入关键字 9
2
④平衡调整 假设由于在二叉排序树上插入结点而失去平衡的最小子树 根结点的指针为a(即a是离插入结点最近,且平衡因子绝对值 超过1的祖先结点),则失去平衡后进行调整的规律可归纳为下 列4种情况: 1.单向右旋平衡处理: 由于在*a的左子树根结点的左子树上插入结点,*a的平衡 因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次 向右的顺时针旋转操作。如图9.6(a)所示。
0 C
RL
0 A AL CL CR
-1 B BR
插入结点
⑤插入算法 算法思想: 在平衡二叉排序树BBST上插入一个新的数据元素e的递归算法 可描述如下: 1.若BBST为空树,则插入一个数据元素为e的新结点作为 BBST的根结 点,树的深度增1; 2.若e的关键字和BBST的根结点的关键字相等,则不进行插入; 3.若e的关键字小于BBST的根结点的关键字,而且在BBST的 左子树中不存在和e有相同关键字的结点,则将e插入在BBST的 左子树上,并且当插入之后的左子树深度增加(+1)时,分别 就下列不同情况处理之:
p
lc
算法9.10如下:
#define #define #define
LH EH RH
+1 0 -1
//左高 //等高 //右高
Status InsertAVL (BSTree &T, ElemType e, Boolean &taller) { //若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入 //一个数据元素为e的新结点,并返回1,否则返回0。若因插入而使二 //叉排序树失去平衡,则作平衡旋转处理,布尔变量taller反映T长高 //与否。

18个查找函数

18个查找函数

18个查找函数查找函数是计算机编程中常用的工具之一,用于在给定数据集中快速找到目标元素。

这些函数广泛应用于各种编程语言和领域,包括数据处理、数据库查询、图形算法等。

本文将介绍18个常见的查找函数,并逐步回答与之相关的问题。

1. 线性查找(Linear Search)线性查找是最简单的一种查找方法,它逐个地比较目标元素与数据集中的每个元素,直到找到目标或遍历完整个数据集。

但是,线性查找的时间复杂度较高,适用于小规模数据集或未排序的数据。

问题1:线性查找的时间复杂度是多少?答:线性查找的时间复杂度为O(n),其中n是数据集的大小。

2. 二分查找(Binary Search)二分查找是一种高效的查找算法,要求数据集必须是有序的。

它通过将数据集分成两半,并与目标元素进行比较,从而逐步缩小查找范围。

每次比较都可以将查找范围缩小一半,因此该算法的时间复杂度较低。

问题2:二分查找要求数据集必须是有序的吗?答:是的,二分查找要求数据集必须是有序的,这是保证算法正确性的前提。

3. 插值查找(Interpolation Search)插值查找是对二分查找的改进,它根据目标元素与数据集中最大和最小元素的关系,估算目标所在位置,并逐步逼近目标。

这种方法在被查找的数据集分布较为均匀时能够显著提高查找效率。

问题3:何时应该使用插值查找而不是二分查找?答:当被查找的数据集分布较为均匀时,插值查找能够提供更好的性能。

而对于分布不均匀的数据集,二分查找可能更适用。

4. 斐波那契查找(Fibonacci Search)斐波那契查找是一种利用斐波那契数列的性质进行查找的算法。

它类似于二分查找,但将查找范围按照斐波那契数列进行划分。

这种方法在数据集较大时能够降低比较次数,提高查找效率。

问题4:为什么使用斐波那契数列进行划分?答:斐波那契数列具有递增的性质,能够将查找范围按照黄金分割比例进行划分,使得划分后的两部分大小接近,提高了查找的效率。

算法面试英文词汇

算法面试英文词汇

算法面试英文词汇以下是一些算法面试中可能会遇到的英文词汇:1. 算法分析:Algorithm Analysis2. 时间复杂度:Time Complexity3. 空间复杂度:Space Complexity4. 递归:Recursion5. 动态规划:Dynamic Programming6. 分治法:Divide and Conquer7. 贪心算法:Greedy Algorithm8. 回溯法:Backtracking9. 插入排序:Insertion Sort10. 快速排序:Quick Sort11. 归并排序:Merge Sort12. 堆排序:Heap Sort13. 二分查找:Binary Search14. 深度优先搜索:Depth-First Search (DFS)15. 广度优先搜索:Breadth-First Search (BFS)16. 优先队列:Priority Queue17. 并查集:Disjoint Set18. 线段树:Segment Tree19. 平衡二叉树:Balanced Binary Tree20. 红黑树:Red-Black Tree21. AVL树:AVL Tree22. 图论:Graph Theory23. 最小生成树:Minimum Spanning Tree (MST)24. 最短路径:Shortest Path25. Dijkstra算法:Dijkstra's Algorithm26. Bellman-Ford算法:Bellman-Ford Algorithm27. Floyd-Warshall算法:Floyd-Warshall Algorithm28. 拓扑排序:Topological Sort29. 网络流:Flow in Networks30. 最少生成树:Minimum Cost Spanning Tree (MCTS)31. 二分图匹配:Bipartite Matching32. 并查集操作:Union, Find, Union-by-Rank, Path Compression33. 二叉堆操作:Insert, Delete, Decrease Key, Increase Key, Merge34. 数据结构操作:Insert, Delete, Search, Get Size, Is Empty, Clear35. 链表操作:Create, Delete, Insert Before, Insert After, Print, Find, Merge36. 数组操作:Sort, Reverse, Find Max/Min, Find Index of Max/Min, Rotate, Transpose37. 树操作:Create Root, Insert Node, Delete Node, Find Node, Find Parent of Node, Print Tree38. 图操作:Create Graph, Add Edge, Delete Edge, Find Nodes Connected by Edge, BFS/DFS from Source Node39. 图论问题常见术语:Vertex Cover, Independent Set, Connected Component, Shortest Path, Bipartite Checking, Max Flow/Min Cut 40. 其他常见术语:Big O notation, Amortized analysis, Randomized algorithm, NP-hard problem41. 其他常用算法术语:Divide and Conquer approach, Greedy approach, Dynamic Programming approach42. 动态规划的边界情况处理:Base case/Recursion case。

数据结构基本英语词汇大全

数据结构基本英语词汇大全

数据结构基本英语词汇大全以下是一些常见的数据结构基本英语词汇:1. Data structure - 数据结构2. Array - 数组3. Linked list - 链表4. Stack - 栈5. Queue - 队列6. Tree - 树7. Binary tree - 二叉树8. Binary search tree - 二叉树9. AVL tree - 平衡二叉树10. Heap - 堆11. Graph - 图12. Hash table - 哈希表13. Set - 集合14. Bag/Stack - 背包/堆栈15. Priority queue - 优先队列16. Graph traversal - 图遍历17. Depth-first search (DFS) - 深度优先18. Breadth-first search (BFS) - 广度优先19. Sorting algorithm - 排序算法20. Bubble sort - 冒泡排序21. Insertion sort - 插入排序22. Selection sort - 选择排序23. Merge sort - 归并排序24. Quick sort - 快速排序25. Hashing - 哈希算法26. Search algorithm - 算法27. Linear search - 线性28. Binary search - 二分29. Graph algorithms - 图算法30. Dijkstra's algorithm - 迪杰斯特拉算法31. Prim's algorithm - 普里姆算法32. Kruskal's algorithm - 克鲁斯克尔算法33. Depth-first search (DFS) - 深度优先34. Breadth-first search (BFS) - 广度优先35. Dynamic programming - 动态规划。

大数据数据结构和算法_树2_AVL树部分

大数据数据结构和算法_树2_AVL树部分

大数据数据结构和算法_树2_AVL树部分AVL树是一种自平衡二叉树,它的特点是每个节点的左子树和右子树的高度差不超过1、AVL树的平衡是通过旋转操作来实现的,这样可以保证树的高度始终在O(log n)的范围内。

AVL树的平衡是通过对节点进行四种旋转操作来实现的:LL、LR、RR、RL旋转。

LL旋转是指当一个节点的左子树的高度大于右子树的高度,并且左子树的左子树高度大于左子树的右子树高度时,需要进行LL旋转。

LL旋转是将当前节点的左子节点提升为根节点,然后将原根节点降为右子节点。

LR旋转是指当一个节点的左子树的高度大于右子树的高度,并且左子树的右子树高度大于左子树的左子树高度时,需要进行LR旋转。

LR旋转是先对当前节点的左子节点进行RR旋转,然后再对当前节点进行LL旋转。

RR旋转是指当一个节点的右子树的高度大于左子树的高度,并且右子树的右子树高度大于右子树的左子树高度时,需要进行RR旋转。

RR旋转是将当前节点的右子节点提升为根节点,然后将原根节点降为左子节点。

RL旋转是指当一个节点的右子树的高度大于左子树的高度,并且右子树的左子树高度大于右子树的右子树高度时,需要进行RL旋转。

RL旋转是先对当前节点的右子节点进行LL旋转,然后再对当前节点进行RR旋转。

AVL树的插入操作和二叉树的插入操作类似,都是先找到插入位置,然后将新节点插入到相应位置。

不同的是,在插入节点之后,需要向上回溯检查每个祖先节点的平衡因子。

如果一些祖先节点的平衡因子超过了1或者小于了-1,就需要进行相应的旋转操作,以恢复平衡。

AVL树的删除操作也和二叉树的删除操作类似,都是先找到要删除的节点,然后根据节点的情况进行删除。

删除节点之后,需要向上回溯检查每个祖先节点的平衡因子,进行相应的旋转操作以恢复平衡。

AVL树的优点是能够维护树的平衡性,使得在最坏情况下的、插入和删除操作的时间复杂度都是O(log n)。

然而,AVL树的缺点是在插入和删除操作中需要进行旋转操作,这会增加一定的时间开销。

avl方案介绍

avl方案介绍

avl方案1. 引言AVL树是一种自平衡二叉查找树,它在操作过程中保持树的高度平衡,从而保证了各种基本操作的时间复杂度为O(log n)。

本文将介绍AVL树的原理、实现方法以及应用场景。

2. AVL树的原理AVL树是由G.M. Adelson-Velsky和E.M. Landis在1962年提出的,它的名称取自于他们的名字的首字母。

AVL树的特点是每个节点的左子树和右子树的高度差不超过1,即保证了树的高度平衡。

AVL树的插入和删除操作会导致树的失衡,为了维持树的平衡,AVL树使用了旋转操作。

旋转操作主要包括左旋和右旋,通过重新调整子树的结构来使得树重新达到平衡。

3. 实现AVL树实现AVL树可以采用递归或迭代的方式,这里以递归方式为例进行说明。

3.1 AVL树节点定义首先需要定义AVL树的节点结构,一个简单的AVL树节点可以包括以下几个字段:class AVLNode:def__init__(self, key):self.key = keyself.left =Noneself.right =Noneself.height =1其中,key字段用于存储节点的键值,left和right字段分别指向节点的左子树和右子树,height字段表示节点的高度。

3.2 AVL树的插入操作AVL树的插入操作分为以下几个步骤:1.找到插入位置,若树为空,则直接插入新节点。

2.根据插入节点的键值与当前节点的键值进行比较,决定向左子树或右子树递归插入。

行旋转操作。

4.若当前节点失衡,根据失衡情况选择合适的旋转操作进行平衡调整。

下面是插入操作的递归实现代码:def insert(root, key):if not root:return AVLNode(key)elif key < root.key:root.left = insert(root.left, key)else:root.right = insert(root.right, key)root.height =1+ max(get_height(root.left), get_height(root.right)) balance = get_balance(root)# 左旋if balance >1and key < root.left.key:return rotate_right(root)# 右旋if balance <-1and key > root.right.key:return rotate_left(root)# 左右旋if balance >1and key > root.left.key:root.left = rotate_left(root.left)return rotate_right(root)# 右左旋if balance <-1and key < root.right.key:root.right = rotate_right(root.right)return rotate_left(root)return root3.3 AVL树的删除操作AVL树的删除操作也需要进行树的平衡调整,它分为以下几个步骤:1.找到待删除的节点。

平衡二叉树的概念

平衡二叉树的概念

平衡二叉树的概念
平衡二叉树(Balanced Binary Tree),又称为AVL树,是一种特殊的二叉搜索树(Binary Search Tree)结构。

平衡二叉树的定义是:对于任意节点,其左子树和右子树的高度之差不超过1,并且左子树和右子树也都是平衡二叉树。

平衡二叉树的设计目的是为了解决普通二叉搜索树在插入、删除等操作时产生不平衡的问题,导致树的高度过高,从而影响搜索的效率。

通过保持树的平衡,平衡二叉树能够保证在最坏情况下的平均时间复杂度为O(log n),其中n是树中节点的数量。

为了保持平衡,平衡二叉树中的每个节点存储了额外的信息,通常是节点的高度。

当在平衡二叉树中插入或删除节点时,需要通过旋转操作来调整树的结构,以满足平衡条件。

旋转操作包括左旋和右旋,通过交换节点的位置来调整树的平衡。

平衡二叉树的应用非常广泛,特别是在需要高效地进行搜索、插入和删除操作的场景中,例如数据库和搜索引擎的索引结构、红黑树等。

通过保持树的平衡,平衡二叉树能够在较小的时间复杂度内完成这些操作,提高了数据结构的效率和性能。

平衡二叉树详解

平衡二叉树详解

动态查找树之平衡二叉树(Balanced Binary Tree,AVL树一、平衡二叉树的概念平衡二叉树(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而失去平衡。

课题_一步一步写平衡二叉树(AVL树)

课题_一步一步写平衡二叉树(AVL树)

一步一步写平衡二叉树(AVL树)平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。

1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。

平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。

这个方案很好的解决了二叉查找树退化成链表的问题,把插入、查找、删除的时间复杂度最好情况和最坏情况都维持在O(logN)。

但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

平衡二叉树实现的大部分过程和二叉查找树是一样的(学平衡二叉树之前一定要会二叉查找树),区别就在于插入和删除之后要写一个旋转算法去维持平衡,维持平衡需要借助一个节点高度的属性。

我参考了机械工业出版社的《数据结构与算法分析- C语言描述》写了一个C++版的代码。

这本书的AVLTree讲的很好,不过没有很完整的去描述。

我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。

第一步:节点信息相对于二叉查找树的节点来说,我们需要用一个属性表示二叉树的高度,目的是维护插入和删除过程中的旋转算法。

代码如下://AVL树节点信息template<class T>class TreeNode{public:TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){}T data;//值int hgt;//以此节点为根的树的高度unsigned int freq;//频率TreeNode* lson;//指向左儿子的地址TreeNode* rson;//指向右儿子的地址};第二步:平衡二叉树(AVL)类的声明声明中的旋转函数将在后边的步骤中详解。

Chapter 9 高度平衡二元搜寻树 AVL Binary Search Tree

Chapter 9 高度平衡二元搜寻树 AVL Binary Search Tree

搜尋 插入 刪除
高度平衡 二元樹 O(log n) O(log n) O(log n)
例二:
-1 50 0 40 0 56 0 60 0 70 0 52
加入52
0 40
-2 50 1 60 1 56
調整
0 50 0 70 0 40
56 0 60 0 52 0 70
高度平衡二元樹刪除及其調整方式
AVL-tree的刪除與二元搜尋樹的刪除相同, 當刪除的動作完成後,再計算平衡因子, 作適當的調整,直到平衡因子的絕對值 皆小於等於1。
高度平衡二元樹加入及其調整方式
原則: 先找到最接近新節點之平衡因子絕對值 大於1(|BF|>1)的祖先節點 將其高度降低使其符合AVL的定義 LL 往右旋轉(rotate) RR 往左旋轉 LR 先右後左 RL 先左後右
高度平衡二元樹加入及其調整方式
LL型:加入新節點於節點s的左子樹之左 子樹
2 50 50 0 40
40
60
Hale Waihona Puke 加入420-1 40 1 45 0 42
0 60
30
45
30
高度平衡二元樹加入及其調整方式
45
調整
40
50
30
42
60
高度平衡二元樹加入及其調整方式
RL型:加入新節點於節點s的右子樹之左 子樹
加入56 56
50 -2 50 1 60 0 56 60 50 60
調整
56
高度平衡二元樹加入及其調整方式
調整
0 10
-1 20 1 30 0 25
高度平衡二元樹刪除及其調整方式
從樹根尋找pivot點(遇到第一個BF值的 絕對值大於1的節點) 由pivot節點的BF值大於等於0時往左子樹、 小於0則往右子樹找下一個節點,來決定 調整的型態。

数据结构九:AVL树(O(logn))

数据结构九:AVL树(O(logn))

数据结构九:AVL树(O(logn))AVL树来自"NOCOW"跳转到: 导航, 搜索本文在GNU自由文档许可证之条款下提供在计算机科学中,AVL树是最先发明的自平衡二叉查找树。

在AVL树中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡树。

查找、插入和删除在平均和最坏情况下都是O(log n)。

增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在1962年的论文"An algorithm for the organization of information" 中发表了它。

节点的平衡因子是它的右子树的高度减去它的左子树的高度。

带有平衡因子 1、0 或 -1 的节点被认为是平衡的。

带有平衡因子 -2 或 2 的节点被认为是不平衡的,并需要重新平衡这个树。

平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。

目录[隐藏]•1操作o 1.1插入o 1.2删除o 1.3查找•2参考实现•3使用高度替代平衡因子•4平衡因子的推算[编辑] 操作AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。

但是要进行预先或随后做一次或多次所谓的"AVL 旋转"。

假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行进行的规律可归纳为下列四种情况:1.单向右旋平衡处理RR:由于在*a的左子树根结点的左子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作;2.单向左旋平衡处理LL:由于在*a的右子树根结点的右子树上插入结点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作;3.双向旋转(先左后右)平衡处理LR:由于在*a的左子树根结点的右子树上插入结点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作。

C#与数据结构--树论--平衡二叉树(AVLTree)

C#与数据结构--树论--平衡二叉树(AVLTree)

C#与数据结构--树论--平衡⼆叉树(AVLTree)介绍我们知道在⼆叉查找树中,如果插⼊元素的顺序接近有序,那么⼆叉查找树将退化为链表,从⽽导致⼆叉查找树的查找效率⼤为降低。

如何使得⼆叉查找树⽆论在什么样情况下都能使它的形态最⼤限度地接近满⼆叉树以保证它的查找效率呢?前苏联科学家G.M. Adelson-Velskii 和 E.M. Landis给出了答案。

他们在1962年发表的⼀篇名为《An algorithm for the organization of information》的⽂章中提出了⼀种⾃平衡⼆叉查找树()。

这种⼆叉查找树在插⼊和删除操作中,可以通过⼀系列的旋转操作来保持平衡,从⽽保证了⼆叉查找树的查找效率。

最终这种⼆叉查找树以他们的名字命名为“AVL-Tree”,它也被称为平衡⼆叉树(Balanced Binary Tree)。

这⾥所说的平衡使我们想到了中庸之道,但有句话说得好,“中不偏,庸不易”。

学会这种平衡术是⼀个相当痛苦的过程。

什么是平衡为了保证平衡,AVL树中的每个结点都有⼀个平衡因⼦(balance factor,以下⽤BF表⽰),它表⽰这个结点的左、右⼦树的⾼度差,也就是左⼦树的⾼度减去右⼦树的⾼度的结果值。

AVL树上所有结点的BF值只能是-1、0、1。

反之,只要⼆叉树上⼀个结点的BF的绝对值⼤于1,则该⼆叉树就不是平衡⼆叉树。

图1演⽰了平衡⼆叉树和⾮平衡⼆叉树。

AVL树的构造如何构造⼀棵平衡⼆叉树呢?动态地调整⼆叉查找树平衡的⽅法为:每插⼊⼀个结点后,⾸先检查是否破坏了树的平衡性,如果因插⼊结点⽽破坏了⼆叉查找树的平衡,则找出离插⼊点最近的不平衡结点,然后将该不平衡结点为根的⼦树进⾏旋转操作,我们称该不平衡结点为旋转根,以该旋转根为根的⼦树称为最⼩不平衡⼦树。

失衡状态可归纳为4种,它们对应着4种旋转类型。

下⾯使⽤了Flash动画演⽰了这四种旋转类型,请确保你的电脑安装了Flash8.0以上版本的播放器,并且浏览器允许使⽤Flash。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

加入80
0 40
調整
-1 60 0 55 -1 70 0 80 0 40 0 50 0 55 70 -1 0 80
高度平衡二元樹加入及其調整方式
LR型:加入新節點於節點s的左子樹之右子 樹
2 50 50 45
加入45
-1 40 40 0 45
調整
40 50
高度平衡二元樹加入及其調整方式
例二:
2 50 50
加入30
1 40 0 30 40
調整
0 30 0 50
不是一棵AVL-tree
高度平衡二元樹加入及其調整方式
例二:
1 50 0 40 0 30 0 45 0 20 0 60 1 30 2 50 0 40 0 60 0 45 0 20
加入20
1 40
調整
1 30 0 45
0 50 0 60
高度平衡二元樹加入及其調整方式
BF=0
hL(M)=0, hR(M)=2 hL-hR=-2
BF=0 N
高度平衡二元樹加入及其調整方式
利用加入的節點A與它最接近平衡因子絕對值大於 1(|BF|>1)的節點B 高度平衡二元樹可能會因為加入或刪除某節點而造 成不平衡,此時必須利用四種不同的調整方式來重 建一棵AVL-tree使其平衡。 AVL-tree 四種調整方式: LL型:加入新節點於節點s的左子樹之左子樹 RR型:加入新節點於節點s的右子樹之右子樹 LR型:加入新節點於節點s的左子樹之右子樹 RL型:加入新節點於節點s的右子樹之左子樹
Chapter 9 高度平衡二元搜尋樹
AVL Binary Search Tree
高度平衡二元樹
何謂高度平衡二元樹(height balanced binary tree)? 空樹(empty tree)是高度平衡二元樹 假使T不是空的二元樹,TL和TR分別是此二元樹的 左子樹和右子樹,若符合下列二個條件,則稱T為 高度平衡二元樹,也稱為AVL-Tree。
RR型:加入新節點於節點s的右子樹之右子樹 此RR型與LL型大同小異,如加入前的AVL-tree 為:
0 50 0 60
加入70
-2 50 -1 60
0
調整
0 50 0 70
60 0 70
不是一棵AVL-tree
高度平衡二元樹加入及其調整方式
例二:
-1 50 0 40 0 55 0 60 0 70 -2 50 0 60
高度平衡二元樹加入及其調整方式
原則: 先找到最接近新節點之平衡因子絕對值 大於1(|BF|>1)的祖先節點 將其高度降低使其符合AVL的定義 LL 往右旋轉(rotate) RR 往左旋轉 LR 先右後左 RL 先左後右
高度平衡二元樹加入及其調整方式
LL型:加入新節點於節點s的左子樹之左 子樹
2 50 50 0 40
調整
0 10
-1 20 1 30 0 25
高度平衡二元樹刪除及其調整方式
從樹根尋找pivot點(遇到第一個BF值的 絕對值大於1的節點) 由pivot節點的BF值大於等於0時往左子樹、 小於0則往右子樹找下一個節點,來決定 調整的型態。
高度平衡二元樹刪除及其調整方式
調整規則如下: 當pivot BF > 0
1. 2. 3.
TL和TR亦是高度平衡二元樹, |hL-hR|≦1,其中hL及hR分別是TL和TR的高度; hL-hR為平衡因子(balanced factor,BF),在AVL-Tree中, 每一節點的平衡因子為-1、0或1
高度平衡二元樹
一棵二元樹的平衡因子
Q
BF= –2
M
S
BF=1
BF=1
P
R
搜尋 插入 刪除
高度平衡 二元樹 O(log n) O(log n) O(log n)
pivot llink BF >= 0 pivot llink BF <= 0 LL型 LR型 LR RL型 RR型
當pivot BF < 0
pivot rlink BF >= 0 pivot rlink BF <= 0
運作
陣列 O(log n) O(n) O(n)
鏈結串列 O(n) O(1) O(1)
40
60
加入42
0
-1 40 1 45 0 42
0 60
30
45
30
高度平衡二元樹加入及其調整方式
45
調整4050304260
高度平衡二元樹加入及其調整方式
RL型:加入新節點於節點s的右子樹之左 子樹
加入56 56
50 -2 50 1 60 0 56 60 50 60
調整
56
高度平衡二元樹加入及其調整方式
高度平衡二元樹刪除及其調整方式
假設存在一棵AVL-tree如左下圖,若欲刪 假設存在一棵AVL-tree如左下圖,若欲刪 除50,因為它為一樹葉節點,故直接刪 50,因為它為一樹葉節點,故直接刪 除之,成為右下圖,刪除後再進行調整
2 30 刪除50 0 20 50 0 10 25 10 20 0 25 30
例二:
-1 50 0 40 0 56 0 60 0 70 0 52
加入52
0 40
-2 50 1 60 1 56
調整
0 50 0 70 0 40
56 0 60 0 52 0 70
高度平衡二元樹刪除及其調整方式
AVL-tree的刪除與二元搜尋樹的刪除相同, 當刪除的動作完成後,再計算平衡因子, 作適當的調整,直到平衡因子的絕對值 皆小於等於1。
相关文档
最新文档