AVL树理解

平衡二叉树是久闻大名了,但是因为其操作的繁琐以及存在更好的替代品所以没怎么接触(事实上是退队了以后就没怎么刷题

正巧这次期末考试就要考这个,那正好详细梳理一下知识:

平衡二叉树,其并没有字面上的那么平衡,其平衡程度能容忍任意节点的左子树高度与右子树高度的差之绝对值不超过1,为了理解方便,我们设定每个节点都有平衡因子,这个平衡因子由左子树高度减右子树高度而来,而且其绝对值不能超过1.

为什么说平衡二叉树没有那么平衡?因为它规定了一个节点的左子树不能和右子树相差过多,但是对于不同的节点之间的高度没有规定,也就是说,仍然是可能存在最深的叶节点和最浅的叶节点的高度差为2的情况的:

如图,我们可以轻松发现最右边的最浅叶节点和左边的最深叶节点之差为2,究其原因,是avl判断树高的时候只会算最高的树高,而其允许其子树内部的两个子树差为1

然后就可以想到,其实这么说来的话,我们可以将上图作为一个右子树附在一个父节点上,左边先接上同样的子树,然后每个叶节点添加左节点和右节点各一个,易证明该操作对于左子树完全合法,不会引起任何旋转。同样,对于我们刚创建的父节点来说,其左树仅比右树高1,也不会引起旋转。重复这个过程,则可以将最浅叶节点与最深叶节点的深度拉到无穷大。

故其实平衡二叉树并非如此平衡。

下面整理一下平衡二叉树的旋转:

a) Left Left Case

T1, T2, T3 and T4 are subtrees.
         z                                      y
        / \                                   /          y   T4      Right Rotate (z)          x      z
      / \          - - - - - - - - ->      /  \    /  \
     x   T3                               T1  T2  T3  T4
    /   T1   T2

b) Left Right Case

     z                               z                           x
    / \                            /   \                        /  \
   y   T4  Left Rotate (y)        x    T4  Right Rotate(z)    y      z
  / \      - - - - - - - - ->    /  \      - - - - - - - ->  / \    / T1   x                          y    T3                    T1  T2 T3  T4
    / \                        /   T2   T3                    T1   T2

c) Right Right Case

  z                                y
 /  \                            /   \
T1   y     Left Rotate(z)       z      x
    /  \   - - - - - - - ->    / \    /    T2   x                     T1  T2 T3  T4
       /      T3  T4

d) Right Left Case

   z                            z                            x
  / \                          / \                          /  \
T1   y   Right Rotate (y)    T1   x      Left Rotate(z)   z      y
    / \  - - - - - - - - ->     /  \   - - - - - - - ->  / \    /    x   T4                      T2   y                  T1  T2  T3  T4
  / \                              /  T2   T3                           T3   T4
上面就是插入的旋转方法,要实现也不怎么简单,这四种,就笔者的猜测来看,是遍历了所有可能的违法状况。

在实际操作中,每插入一个节点,向上回溯直至终点。在这个过程中碰到任何平衡系数违法的情况,则对于这个违法节点进行旋转。

旋转操作应该按照这个就行了,有空的话会用pat的题库验证一下。
发现了一个有意思的性质,可以造福一下不想背旋转的考生:
  a.查找树本身有这样的特性:假设a<b,那么存在两种安排的可能,a作为b的左儿子,或者b作为a的右儿子。
  b.对于二叉查找树来说,其中序遍历即其增序排列;
拿上述的例子d来说,在遇到这样的情况时,我们想把它变成的样子肯定是
  x
 /  \
z    y
(根据本来的大小关系,同时又要保证这三个构成的结果里每个字母节点的平衡系数为0)
但是这样的话,能从原来数据里搬过来的数据只有:
     x
    /  \
   z    y
  / \  /  \
T1   ? ?     T4
此时根据性质b,则存在增序:T1<z<T2<x<t3<y<T4
然后就可以开心的把原数据填上去,左边的问号为T2,右边的问号为T3.
这个就我看来,其本质是二叉搜索树对于大小关系可以允许不同的表示,故必然存在多种形式的表示。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
时间: 2024-10-19 16:28:09

AVL树理解的相关文章

以AVL树为例理解二叉树的旋转(Rotate)操作

树旋转是在二叉树中的一种子树调整操作, 每一次旋转并不影响对该二叉树进行中序遍历的结果. 树旋转通常应用于需要调整树的局部平衡性的场合. 树旋转包括两个不同的方式, 分别是左旋转和右旋转. 两种旋转呈镜像, 而且互为逆操作.  平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找.插入和删除操作在平均和最坏情况下时间复杂度都是O(log n)   AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉

图解平衡二叉树,AVL树(一)

图解平衡二叉树,AVL树(一) 学习过了二叉查找树,想必大家有遇到一个问题.例如,将一个数组{1,2,3,4}依次插入树的时候,形成了图1的情况.有建立树与没建立树对于数据的增删查改已经没有了任何帮助,反而增添了维护的成本.而只有建立的树如图2,才能够最大地体现二叉树的优点. 在上述的例子中,图2就是一棵平衡二叉树.科学家们提出平衡二叉树,就是为了让树的查找性能得到最大的体现(至少我是这样理解的,欢迎批评改正).下面进入今天的正题,平衡二叉树. AVL的定义 平衡二叉查找树:简称平衡二叉树.由前

平衡二叉搜索树(AVL树)的原理及实现源代码(有图文详解和C++、Java实现代码)

一.AVL树(平衡二叉搜索树)是什么? AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个非叶子结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5             5 / \            /  \ 2   6         2   6 / \    \         / \ 1  4   7       1  4

[转载]AVL树(一)之 图文解析 和 C语言的实现

概要 本章介绍AVL树.和前面介绍"二叉查找树"的流程一样,本章先对AVL树的理论知识进行简单介绍,然后给出C语言的实现.本篇实现的二叉查找树是C语言版的,后面章节再分别给出C++和Java版本的实现. 建议:若您对"二叉查找树"不熟悉,建议先学完"二叉查找树"再来学习AVL树. 目录 1. AVL树的介绍 2. AVL树的C实现3. AVL树的C实现(完整源码) 4. AVL树的C测试程序 转载请注明出处:http://www.cnblogs.

AVL树----java

                                                                                    AVL树----java AVL树是高度平衡的二叉查找树 1.单旋转LL旋转 理解记忆:1.在不平衡的节点的左孩子的左孩子插入导致的不平衡,所以叫LL private AVLTreeNode<T> leftLeftRotation(AVLTreeNode<T> k2) { AVLTreeNode<T> k

AVL树的插入与删除

AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少.关键是理解什么时候应该左旋.右旋和双旋.在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下. 1.1 AVL 的旋转 一棵AVL树是其每个节点的左子树和右子树的高度差最多为1的二叉查找树(空树高度定义为-1).AVL树插入和删除时都可能破坏AVL的特性,可以通过对树进行修正来保证特性,修正方法称为旋转. 下面以4个插入操作为例,说明不同旋转对应的场景. 1.1.1 LL-R 插入结点为6,沿着

PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

<pre class="code"><span style="font-family: %value; font-size: 14px;">03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each inpu

平衡二叉树,AVL树之图解篇

学习过了二叉查找树,想必大家有遇到一个问题.例如,将一个数组{1,2,3,4}依次插入树的时候,形成了图1的情况.有建立树与没建立树对于数据的增删查改已经没有了任何帮助,反而增添了维护的成本.而只有建立的树如图2,才能够最大地体现二叉树的优点.            在上述的例子中,图2就是一棵平衡二叉树.科学家们提出平衡二叉树,就是为了让树的查找性能得到最大的体现(至少我是这样理解的,欢迎批评改正).下面进入今天的正题,平衡二叉树. AVL的定义 平衡二叉查找树:简称平衡二叉树.由前苏联的数学

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

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设