先来了解一些基本概念:

1)什么是二叉平衡树?

之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数。

通常来讲是这样的, 但是。。。有例外

比如,我们向一棵树中输入预先排好序的数据, 如1,2,3,4,5,。。。10000, 可以想象到,将形成一棵斜树那么查找10000就要经过9999次比较才能得到,这显然不是我们期望看到的

所以,我们希望引入一个约束条件----任何节点的深度不得过深。

这就是二叉平衡树

二叉平衡树是二叉查找树(排序树)的一种,其每一个节点的左子树和右子树的高度差最多为1

如上图, 左边两棵树并不是二叉平衡树, 因为节点58的左子树和右子树高度差>1。 (分别为2和3)

2)平衡因子?

二叉树上节点的左子树高度 减去 右子树高度, 得到的结果称为该节点的平衡因子

3)最小不平衡树?

当我们给一个二叉平衡树增加新的节点时,会产生最小不平衡树

以   距离插入节点最近的,平衡因子大于1的节点   为根的树, 我们称为最小不平衡树

了解了基本概念之后,我们来看看如何构建一棵二叉平衡树

来看一个例子,我们从初始的空AVL树开始插入3,2,1, 当插入1时, AVL的性质在根(3)处被破坏,此时,我们需要在根与其左儿子间实施单旋转以解决这个问题

我们继续插入节点4, 这没什么问题, 但当我们插入节点5时, AVL的性质在节点3处被破坏, 因此, 我们需要在节点3与其右儿子之间实施一次左旋来解决这个问题

现在我们再插入节点6,此时AVL的性质在根节点(2)处被破坏, 因此我们在根节点和其右节点4之间实施一次左旋

左旋的结果是 4成为根节点,2成为4的左儿子, 4 原本的左儿子3成为2的右儿子

现在再插入节点7, 此时AVL的性质在节点5处被破坏, 因此我们在5节点和其右节点6之间实施一次左旋

根据上面的操作,我们现总结处两条规律:(太绕口,不用记,看图能理解就可以)

假设当我们插入新节点时,导致了原AVL树在节点 p 处不平衡,那么

1)如果添加的新节点是p的左儿子的左儿子, 则在p和其左儿子之间实施一次右旋转, p变成其左儿子的右儿子(如果其左儿子原本已经有右儿子, 则原本的右儿子成为p的左儿子)

2)如果新加的节点是p的右儿子的右儿子, 则在p和其右儿子之间实施一次左旋转,p变成其右儿子的左儿子(如果其右儿子原本已经有左儿子, 则原本的左儿子成为p的右儿子)

感觉头都转晕了

but...真正复杂的还在后面。。。。。。。。

现在我们给上面的二叉树插入节点16,这没什么问题, 再插入15, 此时二叉树在节点7处不再平衡,这时我们发现单旋转已经不能解决问题了, 如果只是在7和16之间左旋的话,15将成为16的右节点,这显然不符合二叉排序树的性质。

因此这里我们需要两次旋转,先在15和16之间进行一次右旋,右旋之后就满足了上文规律2)的条件,此时再进行一次左旋

现在我们再插入14, 跟上面情况类似,插入之后需要执行先右旋再左旋的操作

现在让我们再做个小结,

当我们插入新节点时,导致了原AVL树在节点 p 处不平衡,那么

3)如果添加的新节点是p的右儿子的左儿子, 则先在其右儿子和右儿子的左儿子之间实施一次右旋转, 再在p和其右儿子之间实施一次左旋转

3)如果添加的新节点是p的左儿子的右儿子, 则先在其左儿子和左儿子的右儿子之间实施一次左旋转, 再在p和其左儿子之间实施一次右旋转

再高度总结下: 同向时单旋转,异向时双旋转

原理就到这里了, 代码实现比较复杂,这里就不再写了,个人觉得没有必要,因为AVL树是最古老的平衡树, 我们了解其原理是为了下一步----更好的理解红黑树。

从零开始学算法---二叉平衡树(AVL树)的更多相关文章

  1. (4) 二叉平衡树, AVL树

    1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...

  2. Algorithms: 二叉平衡树(AVL)

    二叉平衡树(AVL):   这个数据结构我在三月份学数据结构结构的时候遇到过.但当时没调通.也就没写下来.前几天要用的时候给调好了!详细AVL是什么,我就不介绍了,维基百科都有.  后面两月又要忙了. ...

  3. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

  4. 二叉平衡树AVL的插入与删除(java实现)

    二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...

  5. 树-二叉平衡树AVL

    基本概念 AVL树:树中任何节点的两个子树的高度最大差别为1. AVL树的查找.插入和删除在平均和最坏情况下都是O(logn). AVL实现 AVL树的节点包括的几个组成对象: (01) key -- ...

  6. 高度平衡的二叉搜索树(AVL树)

    AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...

  7. 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)

    目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...

  8. AVL树(二叉平衡树)详解与实现

    AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...

  9. java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)

    package Demo; public class AVLtree { private Node root; //首先定义根节点 private static class Node{ //定义Nod ...

随机推荐

  1. linux0.01内核源码结构

    目录 boot 系统引导. fs 文件系统. include 头文件.一些C标准库,系统核心库. init 入口.main.c. kernel 内核. lib 库.C源程序,一些基本核心的程序. mm ...

  2. 阿里云搭建elk

    参考了阿里云搭建ELK日志平台安装过程. 系统环境 阿里云ECS 2C2G CentOS 7.6 请确保机器配置至少4G!!! 配置秘钥 1.下载并安装公共签名密钥 [root@aliplay ~]# ...

  3. Java实现小程序微信支付

    小程序支付流程交互图: 进入小程序,下单,请求下单支付,调用小程序登录API来获取Openid,生成商户订单 // pages/pay/pay.js var app = getApp(); Page( ...

  4. 在CentOs7源码安装mysql-5.6.35单实例数据库

    首先安装依赖包,避免在安装过程中出现问题 [root@bogon liuzhen]# yum -y install gcc gcc-c++[root@bogon liuzhen]# yum -y in ...

  5. Linux常用命令(一)之文件处理命令

    分时的多用户.多任务的操作系统 多数的网络协议的支持(unix和tcp/ip协议是同时发展起来的),方便的远程管理(可以通过图形.命令行) 强大的内存管理和文件管理系统 大量的可用软件和免费软件(游戏 ...

  6. noip模拟38

    \(\color{white}{\mathbb{深秋总有廖落处,雁归每是菊败时,名之以:残菊}}\) 这场比赛几乎全场都在打暴力,几乎人均切掉的 \(t1\) 没有想到双指针,\(t3\) 的暴力也没 ...

  7. VUE带Token访问Abp Vnext Api

    上篇登录保存token用了3种方式,都可以在header带上Token访问,本次使用第四种保存方式Vuex中保存状态 stroe中配置好需要保存的字段及方法 import Vue from 'vue' ...

  8. C# Dapper基本三层架构使用 (三、DAL)

    数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加.删除.修改.更新等基本操作 首先需要在UI层App.Config配置文件中增加连接字符串,如下所示 <connectionStr ...

  9. AtCoder Regular Contest 069 D - Menagerie 枚举起点 模拟递推

    arc069.contest.atcoder.jp/tasks/arc069_b 题意:一堆不明身份的动物排成一圈,身份可能是羊或狼,羊一定说实话,狼一定说假话.大家各自报自己的两边是同类还是不同类, ...

  10. 成本降低40%、资源利用率提高20%的 AI 应用产品云原生容器化之路

    作者 郭云龙,腾讯云高级工程师,目前就职于 CSIG 云产品三部-AI 应用产品中心,现负责中心后台业务框架开发. 导语 为了满足 AI 能力在公有云 SaaS 场景下,服务和模型需要快速迭代交付的需 ...