一、平衡二叉树的定义

平衡二叉树(Balanced Binary Tree)又被称为AVL树,它且具有以下性质:

(1)它是一棵空树或它的左右两个子树的高度差的绝对值不超过1;

(2)并且左右两个子树都是一棵平衡二叉树。

把二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。

需要注意的是,平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺点就是,树的结构是无法预料的,随意性很大,它只与节点的值和插入的顺序有关系,往往得到的是一个不平衡的二叉树。在最坏的情况下,可能得到的是一个退化(单支)二叉树,其高度和节点数相同,相当于一个单链表,对其进行查找的时间复杂度由O(logn)变成了O(n),从而丧失了二叉排序树的一些应该有的优点。

二、平衡二叉树AVL调整

在平衡二叉树中删除或插入节点后,可能会使某些节点的平衡因子的绝对值大于 ,即树失去了平衡,这时候就需要进行平衡调整,使其重新满足平衡二叉树的要求。

调整平衡二叉树之前,首先要明白一个定义:最小不平衡子树。最小不平衡子树是指以离插入节点最近、且平衡因子绝对值大于1的节点做根的子树。

平衡二叉树的调整主要分为四种:

(1)单向右旋平衡处理LL:由于在*a的左子树根节点的左子树上插入节点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作;

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点在一条直线上,如同  /  则只需要进行一次向右旋转即可。旋转之后,不平衡节点的左孩子的右子树,需要移动到不平衡节点的左子树上。

(2)单向左旋平衡处理RR:由于在*a的右子树根节点的右子树上插入节点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作;

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点在一条直线上,如同  \ 则只需要进行一次向左旋转即可。旋转之后,不平衡节点的右孩子的左子树,需要移动到不平衡节点的右子树上。

(3)双向旋转(先左后右)平衡处理LR:由于在*a的左子树根节点的右子树上插入节点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作。

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点不在一条直线上,如同  < 则首先需要进行一次向左旋转,然后进行一次向右旋转。

(4)双向旋转(先右后左)平衡处理RL:由于在*a的右子树根节点的左子树上插入节点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作。

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点不在一条直线上,如同  > 则首先需要进行一次向右旋转,然后进行一次向左旋转。

平衡二叉树AVL详解相关推荐

  1. AVL平衡二叉树旋转详解

    AVL(平衡二叉树) AVL定义 左子树和右子树的高度之差的绝对值不超过1,高度之差也叫做平衡因子(Balance Factor),简称BF 左右子树也都是平衡二叉树 当一个节点没有左子树时,左子树高 ...

  2. 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

    数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...

  3. 详解平衡二叉树(AVL),红黑树与平衡二叉树的区别

    目录 1.什么是平衡二叉树 2.平衡二叉树的失衡调整 2.1 左旋 2.2 右旋 3. AVL树的四种插入节点方式 4.平衡二叉树完整代码实现 5.红黑树与平衡二叉树 5.1 红黑树的性质 5.2 旋 ...

  4. AVL树平衡旋转详解

    AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...

  5. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解

    二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...

  6. AVL树的插入与删除(详解)

    AVL树的插入与删除(详解) 平衡二叉树的定义就不在这里赘述了,平衡二叉树的插入与删除都是基于平衡二叉树的查找进行的.平衡二叉树的查找和二叉树的查找又是一样的. 插入的话,我们从平衡二叉树的根结点出发 ...

  7. AVL树的实现(图文详解)

    AVL树的实现 AVL树定义 AVL树其实就是一棵特殊的二叉树,为什么会出现AVL树,AVL树比普通二叉树优势在什么地方呢? 我们知道,一棵普通的二叉搜索树,以其特殊的性质(左<根<右), ...

  8. 平衡二叉树的调整(详解 LL、RR、LR、RL)

    浙江大学讲解视频 平衡二叉树(AVL)的定义: 任一结点的左右子树高度差的绝对值小于等于1,绝对值就是平衡因子 任一结点的左右子树均为AVL树 平衡二叉树也可以是一个空树 平均查找长度(ASL)(查找 ...

  9. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)

    目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...

最新文章

  1. php mssql_result 255 string,PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
  2. 复旦大学教授邱锡鹏:NLP 任务中有哪些巧妙的 idea?
  3. 【ZooKeeper Notes 9】ZooKeepr日志清理
  4. 英伟达驱动更新记录_N卡驱动更新软件(NVIDIA GeForce Experience) v3.16.0.122 官方版
  5. Android 截图并保存到相册
  6. 总结一些最优化算法(ADMM/FISTA)代码网站
  7. 前端开发 元素的浮动 文字环饶效果 横向排列效果 0229
  8. Linux CentOS 7 安装 MySQL(5.7.26)
  9. Android 系统(236)---了解 64 位版本
  10. 昨天在被窝里玩手机游戏到深夜,自己写的“扫雷”,一个字:好玩。
  11. 关于VMware的Server版卸载须知
  12. mysql延迟写入概念_三分钟了解MySQL的简单概念
  13. 51单片机lcd1602显示时间日期
  14. 统计学习方法概论之思维导图图解
  15. 发版名词介绍(alpha,beta,RC,Release)
  16. 搭建各类游戏如何选择合适的服务器
  17. 一天做100张图?只有 AI 能做到!
  18. PHP多人聊天系统,ttltCha​tPHP多人在线聊天系统软件源码 v0.0.12
  19. Qt编写可视化大屏电子看板系统5-恢复布局
  20. 采用直线逼近方式的圆弧插补

热门文章

  1. “妈,你当年咋看上我爸的?”网友晒爸妈结婚照,笑抽了!
  2. 快速入门人工智能,这波福利不能错过!
  3. 震惊整个世界的新发现,科学界的大骗局
  4. 21个令程序员泪流满面的瞬间【第二弹】
  5. 中科大量子计算机科学家,中国科学院量子信息重点实验室
  6. 高级php平时的工作,【高级PHP开发工作内容|工作职责|高级PHP开发做什么】-看准网...
  7. hadoop安装hive及配置mysql_Hadoop系列之Hive(数据仓库)安装配置
  8. 抽屉远离在计算机的应用,抽屉原理的应用及其推广优秀毕业论文
  9. oracle中prad函数_024 SQL函数
  10. dataframe 修改某列_python dataframe操作大全数据预处理过程(dataframe、md5)