AVL树(带有平衡条件的二叉查找树)

定义:一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。

为什么要使用AVL树(即为什么要给二叉查找树增加平衡条件),已经在我之前的博文中说到过:http://www.cnblogs.com/sage-blog/p/3864640.html

AVL树的高度:最大为 1.44log(N+2)-1.328,实际上的高度只比 logN 稍微多一点。

当进行插入操作时,我们需要更新通向根节点的路径上那些节点的所有平衡信息,而插入操作隐含的困难是插入一个节点可能破坏AVL树的特性,这必须通过对树的修正来做到,我们称其为旋转(rotation)。

在插入以后,只有那些从插入节点到根节点的路径上的节点的平衡可能被改变,因为只有这些节点的子树可能发生变化。当我们沿着这条路径上行到根并更新平衡信息时,我们可以找到一个节点,它更新后的平衡信息破坏了AVL条件。如何在第一个这样的节点重新平衡这棵树?

设必须重新平衡的节点为X,这种不平衡可能出现在下面四种情况中:

(1)对X的左儿子的左子树进行一次插入

(2)对X的左儿子的右子树进行一次插入

(3)对X的右儿子的左子树进行一次插入

(4)对X的右儿子的右子树进行一次插入

情形(1)和(4)关于X点对称,(2)和(3)关于X点对称。可以看做只有两种情况。

第一种情况发生在“外面”(左左,右右):对树进行单旋转(single rotation)。

第二种情况发生在“里面”(左右,右左):对树进行双旋转(double rotation)。

单旋转:

上图中我们对X结点进行插入新结点操作之前,k2是满足AVL平衡特性的。在X上插入新结点后,k2的左子树比右子树深2层,k2的AVL平衡特性被破坏。为了使树恢复平衡,我们把X上移一层,并把Z下移一层。我们重新安排结点以形成一棵等价的树。抽象的形容就是:把树的形象地看成是柔软灵活的,抓住结点K1,使劲摇两下这棵树,在重力作用下,k1变成了新的根。最后将K1的右儿子Y放到k2左儿子的位置上是满足二叉查找树的性质的。

***

双旋转:

在图4-34中的子树Y已经有一项插入其中,这个事实保证它是非空的。我们可以假设它有一个根和两棵子树。于是,我们可以把整棵树看成是四棵子树和由三个节点连接。恰好树B或树C中有一棵比D深两层(除非它们都是空的),但是我们不能肯定是哪一棵,但这并不重要,能保证有一棵就行。

为了让树重新平衡,我们不能再让k3作为根了,而图4-34所示的在k3和k1之间的旋转又解决不了问题,唯一的选择就是把k2用作新的根。这迫使k1是k2的左儿子,k3是k2的右儿子,B是k1的右子树,C是k2的左子树,从而完全确定了这四棵树的最终位置。

***

D&F学数据结构系列——AVL树(平衡二叉树)的更多相关文章

  1. D&F学数据结构系列——B树(B-树和B+树)介绍

    B树 定义:一棵B树T是具有如下性质的有根树: 1)每个节点X有以下域: a)n[x],当前存储在X节点中的关键字数, b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x ...

  2. D&F学数据结构系列——二叉排序树

    二叉排序树(Binary Sort Tree) 定义:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值. 二叉查找树声明: #ifndef _ ...

  3. D&F学数据结构系列——二叉堆

    二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...

  4. D&F学数据结构系列——红黑树

    红黑树 定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树: 1)每个结点不是红的就是黑的 2)根结点是黑的 3)每个叶结点是黑的 4)如果一个结点是红的,它的两个儿子都是黑的(即不可能有两个 ...

  5. D&F学数据结构系列——前驱和后继

    前驱和后继 本文所述为二叉排序树的前驱和后继,如果想了解二叉排序树的概念,可以参考我的博文http://www.cnblogs.com/sage-blog/p/3864640.html 给定一个二叉查 ...

  6. D&F学数据结构系列——插入排序

    插入排序(insertion sort) 插入排序由P-1趟(pass)排序组成.对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P-1上的元素为已排序状态.插入排序利用了这样的事实:位置0到位 ...

  7. 数据结构树之AVL树(平衡二叉树)

    一 什么是AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节 ...

  8. 转:红黑树和AVL树(平衡二叉树)区别

    本文转载至链接:https://blog.csdn.net/u010899985/article/details/80981053 一.AVL树(平衡二叉树) (1)简介 AVL树是带有平衡条件的二叉 ...

  9. 06-看图理解数据结构与算法系列(AVL树)

    AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写.AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高. AVL ...

随机推荐

  1. 如何在Eclipse中配置Tomcat

    1.Eclipse EE 配置Tomcat Eclipse EE 主要用于Java Web开发和J2EE项目开发.Eclipse EE中配置Tomcat比较简单,新建一个Tomcat Server即可 ...

  2. Hello World程序

    本文最初发表于2015-8-??,是由别的地方迁移过来的 本文利用改写内存的办法在屏幕中央显示“Hello world”字符串. 首先我们需要了解80*25彩色字符模式显示缓冲区的结构. 〉〉内存中B ...

  3. ggplot2 学习笔记 (持续更新.....)

    1. 目前有四种主题 theme_gray(), theme_bw() , theme_minimal(),theme_classic() 2. X轴设置刻度 scale_x_continuous(l ...

  4. C++ MFC实现基于RFID读写器的上位机软件

    C++ MFC实现基于RFID读写器的上位机软件 该博客涉及的完整工程托管在https://github.com/Wsine/UpperMonitor,觉得好请给个Star (/▽\=) 运行和测试环 ...

  5. Labview实现字符串加密

    Labview实现字符串加密 对字符串进行加密,规则是每个字母后移5 位 例如A 变为F,b 变为g,x 变为c,y 变为d- 实现效果 后端实现

  6. Qt窗体关闭时,如何自动销毁窗体类对象

    Qt窗体关闭时,如何自动销毁窗体类对象     要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...

  7. 将项目初始化到git服务器

    使用的是GitLab来管理Git服务器; 步骤: 一. 先在服务器上创建一个新的项目(GitLab右上角的New project)

  8. 团队开发——第一篇scrum报告

    一.角色介绍 产品负责人(兼项目经理PM):王雪青 scrum master: 陆宇 开发团队:赵建松.张文冬.徐擎天 二.product backlog 1.买家登录后,显示各个小吃摊的信息,主要是 ...

  9. WEB实时聊天 comet推技术

    转自:http://www.cnblogs.com/wodemeng/archive/2012/04/06/2435302.html 今天晚上朋友遇到web服务端推技术的问题,自己就查了下资料,学习了 ...

  10. 如何用pdfbox-app-1.8.10.jar批处理将pdf文档转换成text文档

    1.首先下载pdfbox-app-1.8.10.jar(下载地址:http://pdfbox.apache.org/download.html) 2.将pdfbox-app-1.8.10.jar加载到 ...