AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-VelskyE.M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。

节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。

AVL树的基本操作一般涉及运作同在不平衡的二叉查找树所运作的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL旋转"。

以上内容转自维基百科AVL树

从图中可以比较形象的看出所谓左旋右旋的旋转支点是三个主节点中大小居中的那个节点,左旋就是左边的节点降下来,右旋就是右边的节点降下来,都成为中间节点的子树。

左右双旋分解就是先将左侧节点降为左子树,右边节点将为右子树。当然中间有合并子树的过程,这里没有细说。

高度为h的AVL树,节点数N最多; 最少 ( 其中 )N是h的斐波那契数列。

 
  1. //定义节点
  2. class AvlNode{
  3. int val;
  4. AvlNode left;
  5. AvlNode right;
  6. int height;
  7. public AvlNode(int val,AvlNode left,AvlNode right){
  8. this.val=val;
  9. this.left=left;
  10. this.right=right;
  11. this.height=0;
  12. }
  13. public AvlNode(int val){
  14. this(val,null,null);
  15. }
  16. }
  17. public class AVLTree {
  18. private static final int COUNT=1;
  19. //判断高度
  20. private static int height(AvlNode t) {
  21. // TODO Auto-generated method stub
  22. return t==null?-1:t.height;
  23. }
  24. //节点的插入
  25. public static AvlNode insert(Integer val,AvlNode t){
  26.  
  27. if(t==null){
  28. return new AvlNode(val);
  29. }
  30. int result=val.compareTo(t.val);
  31. if(result<0){
  32. t.left=insert(val, t.left);
  33. }
  34. else if(result>0){
  35. t.right=insert(val, t.right);
  36. }else{
  37. ;
  38. }
  39. //其余按照普通的二叉查找树来写,最后加一个平衡方法
  40. return balance(t);
  41. }
  42. //删除方法,选择了一种比较简单的,在删除之后重新调整树
  43. public static AvlNode remove(Integer x,AvlNode t){
  44. if(t==null){
  45. return null;
  46. }
  47. int result=x.compareTo(t.val);
  48. if(result<0){
  49. t.left=remove(x, t.left);
  50. }else if(result>0){
  51. t.right=remove(x,t.right);
  52. }
  53. else if(t.left!=null&&t.right!=null){
  54. t.val=findMin(t.right).val;
  55. t.right=remove(t.val,t.right);
  56. }else{
  57. t=(t.left!=null)?t.left:t.right;
  58. }
  59. return balance(t);
  60. }
  61.  
  62. private static AvlNode findMin(AvlNode t) {
  63. if(t==null){
  64. return null;
  65. }else if(t.left==null){
  66. return t;
  67. }
  68. return findMin(t.left);
  69. }
  70. //平衡方法
  71. private static AvlNode balance(AvlNode t) {
  72. // TODO Auto-generated method stub
  73. //判断是哪种情况
  74. //如果是左左情况或者是左右情况
  75. if(height(t.left)-height(t.right)>COUNT){
  76. if(height(t.left.left)-height(t.right.right)>COUNT){
  77. //左左情况进行右旋
  78. t=rightSpin(t);
  79. }else{
  80. //右左情况先左旋后右旋
  81. t=leftrightSpin(t);
  82. }
  83.  
  84. }
  85. //如果是右右情况或者是右左情况
  86. else if(height(t.right)-height(t.left)>COUNT){
  87. if(height(t.right.right)-height(t.right.left)>COUNT){
  88. //右右情况进行左旋
  89. t=leftSpin(t);
  90. }else{
  91. //右左情况先右旋再左旋
  92. t=rightleftSpin(t);
  93. }
  94. }
  95. return null;
  96. }
  97. private static AvlNode rightleftSpin(AvlNode t) {
  98. t.right=rightSpin(t.right);
  99. return leftSpin(t);
  100. }
  101. private static AvlNode leftrightSpin(AvlNode t) {
  102. t.left=leftSpin(t.left);
  103. return rightSpin(t);
  104. }
  105. private static AvlNode leftSpin(AvlNode t) {
  106. AvlNode t1=t.right;
  107. t.right=t1.left;
  108. t1.left=t;
  109. t1.height=Math.max(height(t1.left), height(t1.right))+1;
  110. t.height=Math.max(height(t.left),height(t.right));
  111. return t1;
  112. }
  113. private static AvlNode rightSpin(AvlNode t) {
  114. AvlNode t1=t.left;
  115. t.left=t1.right;
  116. t1.right=t;
  117. t1.height=Math.max(height(t1.left), height(t1.right))+1;
  118. t.height=Math.max(height(t.left),height(t.right));
  119. return t1;
  120. }
  121.  
  122. }

AVL树的理解及自写AVL树的更多相关文章

  1. 手写AVL 树(下)

    上一篇 手写AVL树上实现了AVL树的插入和查询 上代码: 头文件:AVL.h #include <iostream> template<typename T1,typename T ...

  2. 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)

    递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ...

  3. 常见基本数据结构——树,二叉树,二叉查找树,AVL树

    常见数据结构——树 处理大量的数据时,链表的线性时间太慢了,不宜使用.在树的数据结构中,其大部分的运行时间平均为O(logN).并且通过对树结构的修改,我们能够保证它的最坏情形下上述的时间界. 树的定 ...

  4. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

  5. 平衡二叉查找树(AVL)的理解与实现

    AVL树的介绍 平衡二叉树,又称AVL(Adelson-Velskii和Landis)树,是带有平衡条件的二叉查找树.这个平衡条件必须要容易保持,而且它必须保证树的深度是 O(log N).一棵AVL ...

  6. [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较

    转自:AVL树.红黑树.B/B+树和Trie树的比较 AVL树 最早的平衡二叉树之一.AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应 ...

  7. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  8. 【面试普通人VS高手系列】b树和b+树的理解

    数据结构与算法问题,困扰了无数的小伙伴. 很多小伙伴对数据结构与算法的认知有一个误区,认为工作中没有用到,为什么面试要问,问了能解决实际问题? 图灵奖获得者: Niklaus Wirth 说过: 程序 ...

  9. 瞎写的树dfs序

    这里枚举了树的DFS序来解决树上问题的多个板子,自己最好多看看. ↓改↓ ↓求↓ 点 点 ————————>>>这个就算了 点 树 简单, BIT 点 链 重点! 树 树 简单, 线 ...

随机推荐

  1. python 之 列表与字典

    1.4 列表与字典 列表与字典,这两种类型,都是各种类型的集合,以列表为例,如果列表中包含列表,就形成嵌套. 这两种类型几乎是所有python脚本的主要工作组件 . 这种结构信息是可变的可修改的.不像 ...

  2. 步步为营101-同一个PCode下重复的OrderNumber重新排序

    USE [K2_WorkFlow_Test] GO /****** Object: StoredProcedure [dbo].[sp_UpdateBPM_DictionaryForOrderNumb ...

  3. 如果IDEA右上角的tomcat消失了,解决办法

    看了很多博客都没有找到解决办法,还是老师帮我解决的

  4. win10ssh连接ubuntu服务器并本地绘图

    update @ 2018-11-07 00:36:38 用xrdp+tigervnc等的组合,可以使用原生unity桌面.具体教程见ubuntu日常使用指南 工具准备 win10上: xshell, ...

  5. reconnecting-websocket.js

    websocket是HTML5下一个不错的网络协议解决方案,有一个场景很多猿猿都会遇到,手机锁屏后大约60秒,IOS会自动断开websocket连接,连接丢失了,那我们的数据也就断了.websocke ...

  6. Codeforces 596D Wilbur and Trees dp (看题解)

    一直在考虑, 每一段的贡献, 没想到这个东西能直接dp..因为所有的h都是一样的. #include<bits/stdc++.h> #define LL long long #define ...

  7. python---初始sqlite3

    ***sqllite不需要单独安装,python2.5以上自带的! ***官方中文文档:https://docs.python.org/2/library/sqlite3.html ***SQLite ...

  8. fastAdmin进阶

    基本知识流程一栏链接 bootstrapTable fastadmin系统配置(符内置规则): fastadmin默认的controller已实现的方法 一张图解析fastadmin的表格: fast ...

  9. RPG

    有排成一行的n个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.以上就是著名的RPG难题. 解 ...

  10. Decision Trees:机器学习根据大量数据,已知年龄、收入、是否上海人、私家车价格的人,预测Ta是否有真实购买上海黄浦区楼房的能力—Jason niu

    from sklearn.feature_extraction import DictVectorizer import csv from sklearn import tree from sklea ...