平衡二叉树插入操作的详细过程图解

二叉搜索树/二叉排序树/二叉查找树

  • 是二叉树、任意结点的左子树的值均小于根节点的值,右子树均大于根节点的值
  • 没有键值相等

    平衡二叉树(AVL树)

  • 定义
    • 左右字数的高度差的绝对值不超过1,并且两子树都是平衡二叉树
    • 没有键值相等
    • 高度差,又名平衡因子,范围为[-1,0,1],在此规定==平衡因子 bf = 右子树的高度-左子树的高度==
  • 插入操作
    1. 当有新的结点插入之前,该树一定是一个平衡二叉树
    2. 按照普通搜索树的方式插入结点cur
    3. 插入之后,调整cur的 parent.bf:插入到左边 bf --;插入到右边 bf++;
    4. bf变为3种值:
      (1)0:插入结束
      (2)-1/1:调整 bf 的过程向上蔓延
      (3 )-2/2:进行修复,
    5. 对失衡的情况进行修复
    6. 插入完成之后,该树依然是一个平衡二叉树
  • 具体步骤
    • 通过查找,找到key的合适的位置并将key插入(如果已经存在,则放弃查找)
    • 设置并修改平衡因子

      • 设置新插入的结点 cur 的平衡因子,新插入的结点的平衡因子是 0(未调整的),因为一定插入在叶子结点
      • 修改 cur 的父节点 parent 的平衡因子 bf
        • 如果cur是parent的左子树,parent.bf -= 1
        • 如果cur是parent的右子树,parent.bf += 1
      • 修改parent.bf 之后,parent.bf 的取值范围为 [-2,-1,0,1,2]
      • 具体情况如下表:
      • 对表格的进一步说明(此处的bf一律指parent.bf):
        • 当bf修改之前是 -1或者 1 ,修改之后变为 0 时,即在父节点的子树高度较小的那一边插入了新结点,使得父结点的左右子树一样高,说明本次插入对整棵树的高度是没有影响的,即其他结点的平衡因子不会改变,因此插入结束
        • 举个栗子:
        • 当bf修改之前是 0 ,修改之后是 -1 或 1 时,即插入之后导致父结点的左右子树高度差1,说明这棵子树的所有父结点的左右子树的高度都有变化,因此其他结点的平衡因子会发生改变,需继续向上调整
        • 举个栗子:
        • 当bf修改之前是 -1或 1,修改之后是 -2 或 2时,即插入之后父结点的左右子树高度差2,已经失衡,需要将当前 parent 进行调整,使之再次保证平衡,进而参考上表做出下一步操作
        • 举个栗子:
    • 失去平衡的调整方法:
      • 解决失衡的方法口诀

        • 左左失衡,parent右旋;
        • 左右失衡,cur左旋,parent右旋;
        • 右右失衡,parent左旋;
        • 右左失衡,cur右旋,parent左旋;
      • 解析:parent为当前失衡的结点,cur为parent的孩子(新结点所在的子树的根节点)
      • eg:
      • 四种失衡状态:
      • 很明显:如果从根节点到新插入的结点是一路向左,即左左失衡;如果中途向右了,即左右失衡;如果一路向右,即为右右失衡;如果中途向左了,即右左失衡;
      • 根据不同的失衡,口诀中有不同的解决方法,接下来我们一起来验证一下吧:
        • ”左左失衡,parent右旋“:
      • “左右失衡,cur左旋,parent右旋”:
      • “右右失衡,parent左旋”:
        • “右左失衡,cur右旋,parent左旋”:
    • 调整之后,该树还是一个平衡二叉树

原文地址:https://blog.51cto.com/14233363/2482901

时间: 2024-10-12 15:42:12

平衡二叉树插入操作的详细过程图解的相关文章

AVL树的插入操作(旋转)图解

=================================================================== AVL树的概念 在说AVL树的概念之前,我们需要清楚二茬搜索树的概念.对于二叉搜索树,我们知道它可以降低查找速率,但是如果一个二叉搜索树退化成一棵只剩单支的搜索树,此时的查找速率就相当于顺序表中查找元素,效率变低,时间复杂度由原来的O(logN)变为O(N). 此时就有了AVL(高度平衡二叉搜索树),从它的名字就能知道它也是一棵二叉搜索树,只是它在插入元素的时候

Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程

前言:      SQLite是遵守ACID 的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.       不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协议是在编程语言内的直接API调用.这在消耗总量.延迟时间和整体简单性上有积极的作用.整个数据库(定义.表.索引和数据本身)都在宿主主机上存储在一个单一的文件中.它的简单的设计是通过在开始一个事务的时候锁定整个数

用VMware 8安装Ubuntu 12.04详细过程(图解)

图解演示环境版本: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS  (请点击这里)先下载好iso镜像文件 详细过程图解: 0. 初始画面,点击"Create a New Virtual Machine"(左上Ubuntu为本人已有开发环境机,请忽略) 1. 点击"Custom(自定义)" 2. 无需选择,直接Next(上面是选Workstation版本的兼容性的,这里默

VMware Workstations安装Linux系统之Centos7系统详细流程图解

VMware Workstations安装Linux系统之Centos7系统详细过程图解1 原文地址:https://blog.51cto.com/14557673/2446507

AVL树的初步生成与插入操作

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.构造与调整方法 平衡二叉树的常用算法有红黑树.AVL.Treap等. 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量. AVL是最先发明的

红黑树,TreeMap,插入操作

红黑树 红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡.对于一棵有效的红黑树二叉树而言我们必须增加如下规则: 1.每个节点都只能是红色或者黑色 2.根节点是黑色 3.每个叶节点(NIL节点,空节点)是黑色的. 4.如果一个结点是红的,则它两个子节点都是黑的.也就是说在一条路径上不能出现相邻的两个红色结点. 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点. 这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长

【甘道夫】HBase基本数据操作的详细说明【完整版,精绝】

介绍 之前具体写了一篇HBase过滤器的文章.今天把基础的表和数据相关操作补上. 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于"hbase 0.96.2-hadoop2"版本号编写,均实測通过. 欢迎转载,请注明来源: http://blog.csdn.net/u010967382/article/details/37878701 概述 对于建表,和RDBMS类似,HBase也有namespace的概念.能够指定表

PHP操作redis详细讲解(转)

PHP中redis的使用 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操

数据结构&&AVL树原理、插入操作详解及实现

1.基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级--它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 2.AVL树是什么? AVL树本质上还是一棵二叉搜索树(因此读者可以看到我后面的代码是继承自二叉搜索树的),它的特点是: 1. 本身首先是一棵二叉搜索树. 2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5              5 / \            / \ 2   6          2