转自:http://blog.csdn.net/huiguixian/article/details/6360682

昨天腾讯面试把平衡二叉树当做排序二叉树,绝对遭鄙视了,汗...

平衡二叉树简称平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树。他的定义很简单,就是若一棵二叉树的每个左右节点的高度差最多相差1,此二叉树即是平衡二叉树。把二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。

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

当插入一个新的节点的时候,在普通的二叉树中不用考虑树的平衡因子,只要将大于根节点的值插入到右子树,小于节点的值插入到左子树,递归即可。而在平衡二叉树则不一样,在插入节点的时候,如果插入节点之后有一个节点的平衡因子要大于2或者小于-2的时候,他需要对其进行调整,现在只考虑插入到节点的左子树部分(右子树与此相同)。主要分为以下三种情况:

(1)若插入前一部分节点的左子树高度和右子树高度相等,即平衡因子为0,插入后平衡因子变为1,仍符合平衡的条件不用调整。

(2)若插入前左子树高度小于右子树高度,即平衡因子为-1,则插入后将使平衡因子变为0,平衡性反倒得到调整,所以不必调整。

(3)若插入前左子树的高度大于右子树高度,即平衡因子为1,则插入左子树之后会使得平衡因子变为2,这样的情况下就破坏了平衡二叉树的结构,所以必须对其进行调整,使其加以改善。

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

下面讲解平衡二叉树最基本的4种调整操作,调整的原则是调整后他的搜索二叉树的性质不变,即树的中序遍历是不会改变的:

1. LL型调整。在B点的左子树上插入一个节点。插入后B点的左子树的平衡因子变为1,A节点的平衡因子变为了2。这样可以看出来A节点为根节点的子树是最小不平衡子树。调整时,将A的左孩子B向右旋转代替A称为原来不平衡子树的根节点,将A的节点右下旋转称为B的右子树的根节点,而B的原右子树变为A的左子树。详细过程如下图:

2. RR型调整操作

在A节点的右孩子的右子树上插入节点,使得A节点的平衡因子由-1变为-2而引起的不平衡所进行的调整操作。调整操作大致一样,看图就可以明白了。

3. LR型的调整操作。在A节点的左孩子的右子树上插入节点,使得A节点的平衡因子由1变为了2而引起的不平衡所进行的调整的操作。调整过程如图:

4. RL型的调整操作。不多说了,直接上图:

在二叉搜索树的插入和删除运算中,采用平衡树的优点是:使树的结构较好,从而提高查找运算的速度。缺点是:是插入和删除运算变得复杂化,从而降低了他们的运算速度。对二叉搜索树删除节点而引起的不平衡性进行的操作比插入节点的情况要复杂,在此就不再论述了。

平衡二叉树及其应用场景相关推荐

  1. 关于二叉树、平衡二叉树、红黑树

    目录 1.二叉树缺点 2.平衡二叉树 3.为什么有了平衡二叉树,还要红黑树? 参考文章:记一次腾讯面试:有了二叉查找树.平衡树(AVL)为啥还需要红黑树? 1.二叉树缺点 二叉查找树,相信大家都接触过 ...

  2. mysql 索引 二叉树_MySQL 的索引,为什么是 B+而不是平衡二叉树

    数据库为什么使用 B+ 树? 前言 讲到索引,第一反应肯定是能提高查询效率.例如书的目录,想要查找某一章节,会先从目录中定位.如果没有目录,那么就需要将所有内容都看一遍才能找到. 索引的设计对程序的性 ...

  3. 【算法】论平衡二叉树(AVL)的正确种植方法

    参考资料 <算法(java)>                           - - Robert Sedgewick, Kevin Wayne <数据结构>       ...

  4. 完全二叉树、平衡二叉树、二叉查找树(二叉排序树)

    完全二叉树 完全二叉树是一种特殊的二叉树,满足以下要求: 所有叶子节点都出现在 k 或者 k-1 层,而且从 1 到 k-1 层必须达到最大节点数: 第 k 层可以不是满的,但是第 k 层的所有节点必 ...

  5. JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介

    JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类.本文将就Java Collections Fram ...

  6. B树、B+树、LSM树以及其典型应用场景

    前言 动态查找树主要有:二叉查找树.平衡二叉树.红黑树.B树.B+树.前面三种是典型的二叉查找树,查找的时间复杂度是O(log2N)与树的深度有关系,那么降低树的深度也就可以提升查找效率.这时就提出了 ...

  7. 面试官:了解二叉树吗,平衡二叉树,红黑树?

    前言 面试过程中,多多少少会问一点数据结构(二叉树)的问题,今天我们来复习一下二叉树的相关问题,文末总结. 1. 二叉树的由来 在 jdk1.8 之前,HashMap 的数据结构由「数组+链表」组成, ...

  8. 【数据结构与算法】平衡二叉树、红黑树

    1.树.二叉树 2.二叉查找树 3.平衡二叉树.红黑树 4.递归树 一,什么是"平衡二叉查找树" 1,定义:二叉树中任意一个节点的左右子树的高度相差不能大于1. 所以:完全二叉树, ...

  9. 映射表map(平衡二叉树实现)_手动实现Java集合容器之TreeMap(上)

    上一篇我们手写了HashMap,还有一个很重要的Map的实现类TreeMap.打开源码第一句话:* A Red-Black tree based {@link NavigableMap} implem ...

最新文章

  1. 从控制器到驱动器的WD——硬盘巨头启示录之西数篇
  2. Jpeglib读取jpg文件
  3. Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件
  4. 把自己当成打工的,一辈子都是打工的!:周鸿祎
  5. 访问 IIS 元数据库失败 的解决方法
  6. axure web组件下载_实践干货:Axure插入图标的4种办法
  7. c/c++ 重载运算符 函数调用运算符
  8. 第三十讲:Android之Animation(五)
  9. TransE算法解析
  10. Spring配置属性文件
  11. 【转载】【原创】贵在,难在,成在
  12. 易语言数据类型与c 对照,详解易语言中的数据类型
  13. 网络延迟及故障分析与排查实战
  14. 《实变函数简明教程》,P63,f可测等价于f+,f-均可测 以及 f可测蕴涵|f|可测
  15. Pod进阶(容器本质,Pod实现,容器设计模式)
  16. android camera慢动作,慢动作相机app下载-慢动作相机软件 安卓版v1.1-PC6安卓网
  17. 求解最大连续子序列和问题———分治法
  18. 数字的ASCII码值转为大写字母
  19. android 查看手机存储空间以及文件状态及大小
  20. IC学习笔记1——建立时间和保持时间

热门文章

  1. Infopath重复表分页(原创)
  2. Win2003用NAT实现ADSL共享与×××服务器
  3. Node核心模块Buffer
  4. button 去掉原生边框
  5. 设计模式之Dynamic Proxy-动态代理
  6. Java并发系列—工具类:CountDownLatch
  7. php,cgi,nginx关系
  8. 2011-04-21 运程连Oracle的方法
  9. poj4051Chess:搜索
  10. SQL Server 2016:实时查询统计