zoukankan      html  css  js  c++  java
  • 平衡二叉树

    前面我写了一篇二叉排序树。最后我们提到提高二叉排序树的查找效率是让二叉树的形状均衡,所以就引入了平衡二叉树。

    特点:

    • 一种特殊类型的二叉排序树

    • 全部结点的左、右子树深度之差的绝对值≤1

    • 左右子树是平衡二叉树。

    平衡因子:该结点左子树和右子数的高度差

    随意一个结点的平衡因子仅仅能取:-1、0或1;假设树中随意一个结点的平衡因子的绝对值大于1,则这棵二叉树就失去平衡,不再是AVL树。

    对于一棵有n个结点的AVL树,其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级。

    这里写图片描写叙述

    假设在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须又一次调整树的结构,使之恢复平衡。我们称调整平衡过程为平衡旋转

    调整方法:找到最小不平衡子树。可将又一次平衡的范围局限于这棵子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各个结点之间的链接关系。进行对应的旋转,使之成为新的平衡子树。

    最小不平衡子树:离插入结点近期且平衡因子绝对值超过1的祖先结点。以该结点为根的子树称为最小不平衡子树。

    假设最小不平衡子树的根结点为A,则失去平衡后进行调整的规律可归纳为下面四种情况。

    • LL平衡旋转

    • RR平衡旋转

    • LR平衡旋转

    • RL平衡旋转

    1)LL平衡旋转:

    若在A的左子树的左子树插入结点,使A的平衡因子从1添加到2。须要进行一次向右顺时针旋转

    (以B为旋转轴)
    这里写图片描写叙述

    这里写图片描写叙述

    2)RR平衡旋转:

    若在A的右子树上插入结点,使A的平衡因子从-1
    添加至-2,须要进行一次逆时针旋转(以B为旋转轴)

    这里写图片描写叙述

    这里写图片描写叙述

    3)LR平衡旋转:

    若在A的左子树的右子树上插入结点,使A的平衡因子从1添加到2,须要先进行逆时针旋转。再顺时针旋转。(以插入的结点C为旋转轴)
    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

    4)RL平衡旋转:

    若在A的 右子树的左子树上插入结点,使A的平衡因子从-1添加到-2,则须要先进行顺时针旋转。再进行逆时针旋转。

    (以插入的结点C为旋转轴)
    这里写图片描写叙述

    这里写图片描写叙述

    这里写图片描写叙述

  • 相关阅读:
    POJ 2337 【欧拉路径<包含输出>】.cpp
    Hlg 【表达式求值+欧拉路径】.cpp
    Hlg 1563 亲合数.cpp memset
    Hlg 1619 只有矩形.cpp【并查集】
    用unison来同步你的远程文件夹 Fwolf's Blog
    调试intellij IDEA hbase开发环境
    Bash: parsing arguments with ‘getopts’ | rsalveti's random thoughts
    十天内提高单词量到20000! (Vocabulary 10000)
    Unison File Synchronizer User Manual and Reference Guide
    Import errors in djangocms
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7353298.html
Copyright © 2011-2022 走看看