平衡二叉树(AVL)介绍及其实现】的更多相关文章

一.平衡二叉树 任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进.因此查找中数据比较次数与树的形态密切相关. 对于二叉树来说,当树中每个结点左右子树高度大致相同时,树高为logN.则平均查找长度与logN成正比,查找的平均时间复杂度在O(logN)数量级上.当先后插入的关键字有序时,BST退化成单支树结构.此时树高n.平均查找长度为(n+1)/2,查找的平均时间复杂度在O(N)数量级上. 二叉查找树在最差情况下竟然和顺序查找效率相当,这是无法仍受的.事实也证明,当存储数据足够…
数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况"所示,此时树的高度为⌊log2 n⌋ + 1,所以时间复杂度为O(lg n)当我们将键以升序或者降序插入的时候,得到的是一棵斜树,如下图中的"最坏情况",树的高度为n,时间复杂度也变成了O(n) 在最坏情况下,二叉查找树的查找和插入效率很低.为了解决这个问题,引出了平衡二叉树(AV…
平衡二叉树(AVL 树) 1 看一个案例(说明二叉排序树可能的问题) 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在.  左边 BST 存在的问题分析: 1) 左子树全部为空,从形式上看,更像一个单链表. 2) 插入速度没有影响 3) 查询速度明显降低(因为需要依次比较), 不能发挥 BST 的优势,因为每次还需要比较左子树,其查询速度比 单链表还慢 4) 解决方案-平衡二叉树(AVL)   2 基本介绍 1) 平衡二叉树也叫平衡二叉搜索树(Self…
二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根结点的数据域.如下图所示: 二叉查找树通常包含查找.插入.建树和删除操作. 二叉查找树的创建 对于一棵二叉查找树,其创建与二叉树的创建很类似,略有不同的是,二叉查找树,为了保证整棵树都关于根结点的大小呈左小右…
平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 首先我们知道,当插入一个节点,从此插入点到树根节点路径上的所有节点的平衡都可能被打破,如何解决这个问题呢? 这里不讲大多数书上提的什么平衡因子,什么最小不平衡子树,实际上让人(me)更加费解.实际上你首要做的就是先找到第一个出现不平衡的节点,也就是从插入点到root节点的路径上第一个出现不平衡的节点,即深度最深的那个节点A,对以它为根的子树做一…
1. [定义] 二叉排序树(二拆查找树)中,左子树都比节点小,右子树都比节点大,递归定义. [性能] 二叉排序树的性能取决于二叉树的层数 最好的情况是 O(logn),存在于完全二叉排序树情况下,其访问性能近似于折半查找(见下图 a): 最差时候会是 O(n),比如插入的元素是有序的,生成的二叉排序树就是一个链表,这种情况下,需要遍历全部元素才行(见下图 b). 2. [定义] 平衡二叉树(AVL)中,符合二叉查找树的基础上,任意节点的两个子树的最大高度差为一. 需要左旋和右旋 3. [定义]…
平衡二叉树的插入过程:http://www.cnblogs.com/hujunzheng/p/4665451.html 对于二叉平衡树的删除采用的是二叉排序树删除的思路: 假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论: ⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可. ⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可. ⑶ 若结点*p的左.右子树均非空,先找到*p的中序前趋结点*s(注意*s是*…
平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树.平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态.这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(…
相关介绍:  二叉查找树的查找效率与二叉树的形状有关,对于按给定序列建立的二叉排序树,若其左.右子树均匀分布,则查找过程类似于有序表的二分查找,时间复杂度变为O(log2n).当若给定序列原来有序,则建立的二叉查找树就蜕化为单链表,其查找效率同顺序查找一样,时间复杂度为O(n).因此,在构造二叉查找树的过程中,当出现左右子树分布不均匀时,若能对其进行调整,使其依然保持均匀,则就能有效的保证二叉查找树仍具有较高的查找效率.而平衡二叉树,正是这样的一棵树.  平衡二叉树,又称为AVL树,它或是一棵空…
看完了第一篇博客,相信大家对于平衡二叉树的插入调整以及删除调整已经有了一定的了解,下面,我们开始介绍代码部分. 首先,再次提一下使用的结构定义 typedef char KeyType; //关键字 typedef struct MyRcdType //记录 { KeyType key; }RcdType,*RcdArr; typedef enum MyBFStatus //为了方便平衡因子的赋值,这里进行枚举 { //RH,EH,LH分别表示右子树较高,左右子树等高,左子树较高 RH,EH,L…