数据结构--AVL树

原创 2018年04月15日 11:03:28

AVL树


AVL树是带有平衡条件的二叉查找树。一颗AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树

当进行插入操作时,我们需要更新通向根节点路径上那些节点的所有平衡信息,而插入操作隐含着困难的原因在于,插入一个节点可能破坏AVL树的特性。如果发生这种情况,那么就要在考虑这一步插入完成之前恢复平衡的性质。事实上,这总可以通过对树进行简单的修正来做到,我们称其为选择

我们把必须重新平衡的节点叫做a。由于任意节点最多有两个儿子,因此出现高度不平衡就需要a点的两颗子树的高度差2。容易看出有下面4中情况:

  • 对a的左儿子的左子树进行一次插入
  • 对a的左儿子的右子树进行一次插入
  • 对a的右儿子的右子树进行一次插入
  • 对a的右儿子的左子树进行一次插入

    因为情况1和4,以及2和3是两组关于a点的镜像对称。因此,理论上只有两种情况,当然从编程的角度来看还是四种情况

    第一种情况是插入发生在“外边”的情况(即左-左的情况或者右-右的情况),该情况通过对树的一次单旋转而完成调整。

    第二种情况是插入发生在“内部”的情形(即左-右的情况或者右-左的情况),该情况通过稍微复杂些的双旋转来处理。

private static class AvlNode<AnyType>{
    AvlNode(AnyType theElement)
    {this(theElement, null, null);}

    AvlNode(AnyType theElement, AvlNode<AnyType> lt, AvlNode<AnyType rt)
    {element = theElement; left = lt; right = rt; height = 0;}

    AnyType element;
    AvlNode<AnyType> left;
    AvlNode<AnyType> right;
    int height;
}



单旋转


为使树恢复平衡,我们把X上移一层,并把Z下移一层。即搜寻到不符合AVL的性质(左右子树高度差为1)节点k2,使其左子树k1上升,并且k2自身下降,并且k1的右子树称为为k2的左子树。

private AvlNode<AnyType> rotateWithLeftChild(AvlNode<AnyType k2){

    AvlNode<AnyType> k1 = k2.left;
    k2.left = k1.right;
    k1.right = k2;
    k2.height = Math.max(height(k2.left), height(k2.right)) + 1;
    k1.height = Math.max(height(k1.left), height(k2.right)) + 1;
    return k1;
}



双旋转


节点k2上升至k1,k1作为k2的左子树且获得k2的左子树,k3作为k2的右子树且获得k2的右子树。相当于进行了两次单旋转,第一为右旋转,第二次为左旋转,所以称为双旋转。

private AvlNode<AnyType> doubleWithLeftChild(AvlNode<AvlType> k3){

    k3.left = rotateWithRightChild(k3.left);
    return rotateWithLeftChild(k3);
}

【数据结构】AVL树详解

1.什么是AVL树 AVL树又称平衡二叉搜索树,它能保证二叉树高度相对平衡,尽量降低二叉树的高度,提高搜索效率。单纯的二叉搜索树在最坏的情况下插入查找删除等操作时间复杂度会是O(N), 例如: 所...
  • pointer_y
  • pointer_y
  • 2016-11-02 21:41:34
  • 1274

数据结构与算法分析(三) —— AVL树的实现

本文实现了AVL树,有几个注意点:insert和remove引起的失衡都可以用同样的旋转进行修复: Case1:k2的左子树的左子树比其右子树高2 —— k2进行左单旋 Case4:k1的右子树的右子...
  • lipengcn
  • lipengcn
  • 2016-07-21 10:07:44
  • 855

数据结构课程设计AVL树的运用程序和实验报告

  • 2014年02月24日 20:44
  • 184KB
  • 下载

数据结构&&AVL树原理、插入操作详解及实现

AVL树原理、插入数据原理、实现。
  • sp_programmer
  • sp_programmer
  • 2014-12-08 23:59:07
  • 2927

华科数据结构AVL树课设

  • 2018年03月11日 15:21
  • 871KB
  • 下载

AVL树 封装左旋 右旋操作

#include &amp;lt;iostream&amp;gt; using namespace std; struct AVLTreeNode{ public: int key; /...
  • L1558198727
  • L1558198727
  • 2017-12-01 19:59:52
  • 4128

【数据结构】平衡二叉树[AVL树](一)——插入

AVL 树是带有平衡条件的二叉查找树,所谓的平衡条件就是每个节点的左子树和右子树的高度最大差别为1。平衡二叉树的实现大部分过程和二叉查找树是一样的,区别在于要时刻保持树的平衡,所以在插入和删除之后要添...
  • yeswenqian
  • yeswenqian
  • 2014-03-26 17:37:35
  • 4542

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

【版权申明】未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自...
  • javazejian
  • javazejian
  • 2016-12-31 23:40:43
  • 10128

【数据结构】平衡二叉树[AVL树](二)——删除

前面介绍了平衡二叉树的插入操作:平衡二叉树的插入,这里来介绍平衡二叉树的删除,平衡二叉树是一棵带有平衡条件的二叉查找树,其删除操作是在二叉查找树的基础上添加平衡调整算法。 二叉查找树的删除操作参见博...
  • yeswenqian
  • yeswenqian
  • 2014-03-27 18:01:46
  • 3356

数据结构与算法——AVL树简介

AVL树简介
  • Linux_ever
  • Linux_ever
  • 2016-03-27 22:43:42
  • 1513
收藏助手
不良信息举报
您举报文章:数据结构--AVL树
举报原因:
原因补充:

(最多只允许输入30个字)