1、平衡二叉树定义

是一种二叉排序树(二叉查找树、二叉搜索树),其中每个节点的左子树和右子树的高度差不大于1。(左右子树也是平衡二叉树)

平衡因子BF = 二叉树节点的左子树深度减去右子树深度 = 节点的平衡因子(BF)

最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树。

为了提高查找效率,把二叉排序树构造成平衡二叉树。平衡二叉树的查找、插入和删除的时间复杂度都是O(logn),最坏情况下,二叉排序树的查找时间复杂度是O(n)即非常不平衡的斜树。所以要构造平衡二叉树提高查找效率。

2、平衡二叉树的构建方法:

若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。

失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于 1 的结点作为根的子树。假设用 A 表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。

( 1 ) RR 型平衡旋转法(右旋)

由于在 A 的左孩子 B 的左子树上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行一次顺时针旋转操作。 即将 A 的左孩子 B 向右上旋转代替 A 作为根结点, A 向右下旋转成为 B 的右子树的根结点。而原来 B 的右子树则变成 A 的左子树。

( 2 ) LL 型平衡旋转法(左旋)

由于在 A 的右孩子 C  的右子树上插入结点 F ,使 A 的平衡因子由 -1 减至 -2 而失去平衡。故需进行一次逆时针旋转操作。即将 A 的右孩子 C 向左上旋转代替 A 作为根结点, A 向左下旋转成为 C 的左子树的根结点。而原来 C 的左子树则变成 A 的右子树。

( 3 ) LR 型平衡旋转法(左右)

由于在 A 的左孩子 B 的右子数上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。即先将 A 结点的左孩子 B 的右子树的根结点 D 向左上旋转提升到 B 结点的位置,然后再把该 D 结点向右上旋转提升到 A 结点的位置。即先使之成为 LL 型,再按 LL 型处理 。

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到 A 的左子树上,此时成为 LL 型,再按 LL 型处理成平衡型。

( 4 ) RL 型平衡旋转法(右左)

由于在 A 的右孩子 C 的左子树上插入结点 F ,使 A 的平衡因子由 -1 减至 -2 而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针),即先将 A 结点的右孩子 C 的左子树的根结点 D 向右上旋转提升到 C 结点的位置,然后再把该 D 结点向左上旋转提升到 A 结点的位置。即先使之成为 RR 型,再按 RR 型处理。

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到 A 的左子树上,此时成为 RR 型,再按 RR 型处理成平衡型。

平衡化靠的是旋转。 参与旋转的是 3 个节点(其中一个可能是外部节点 NULL ),旋转就是把这 3 个节点转个位置。注意的是,左旋的时候 p->right 一定不为空,右旋的时候 p->left 一定不为空,这是显而易见的。

如果从空树开始建立,并时刻保持平衡,那么不平衡只会发生在插入删除操作上,而不平衡的标志就是出现 bf == 2 或者 bf == -2 的节点。

高度平衡二叉树的构建_平衡二叉树(AVL)树相关推荐

  1. 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)

    构造方法 平衡二叉树 对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为 O(logn) ,但是它们的最差 运行时间都是 O(n), 原因在于对树的形状没有限制. 平衡二叉树又称为 AVL 树, ...

  2. 高度平衡二叉树的构建_平衡二叉树建立及其增删改查(JAVA)

    平衡二叉树:指的是左右子树高度差的绝对值不超过一的二叉排序树. 主要思路:1.用左高度跟右高度代替平衡因子,大于1进行L~调整,小于-1进行R~调整 2.每次插入都通过递归计算一次各结点高度,然后进行 ...

  3. 高度平衡二叉树的构建_数据结构与算法系列(十六)平衡二叉树的构建实现过程演示...

    我们在上一篇文章中分享了平衡二叉树的定义和实现原理,这一节我们来演示如何通过代码实现平衡二叉树,最后分析下平衡二叉树的算法复杂度. 实例演示 在开始之前,我们先通过一个对比来加强理解,在没有介绍平衡二 ...

  4. 平衡二叉树的旋转_平衡二叉树的旋转

    一.平衡二叉树的定义 为避免树的高度增长过快,降低二叉树的排序性能,规定在插入和删除二叉树结点时,保证任意结点的左右子树高度差的绝对值不大于1.这样的二叉树被称为平衡二叉树(Balanced Bina ...

  5. java数据结构与算法之平衡二叉树(AVL树)的设计与实现中的事实代码

    普通二叉查找树的问题   在开篇,我们提到过,普通二叉树(二叉查找树)在操作的时间复杂度上不一定遵循O(㏒n),也有可能是O(n),这是为什么呢?在上一篇中,我们明明插入都按照一定规则比较的呀,其实那 ...

  6. 3. 数据结构--二叉树 BST AVL树 Huffman

    数据结构–二叉树 KEY:(不敢相信没有堆-) 二叉树的定义及其主要特征 ☑️ 二叉树的顺序存储结构和链式存储结构实现 二叉树的遍历及应用 二叉排序(查找.检索)树 (BST) 平衡的二叉检索树- A ...

  7. 【C++】-- AVL树详解

    目录 一.AVL树概念 1.二叉搜索树的缺点 2.AVL树的概念 二.AVL树定义 1.AVL树节点定义 2.AVL树定义 三.AVL树插入 1.插入节点 2.控制平衡 (1)更新平衡因子 (2)旋转 ...

  8. C++ AVL树(补充)

    目录 AVL树的插入(包含更新平衡因子) 子树的旋转 子树的左旋转 子树的右旋转 左右双旋 右左双旋 求树的高度 判断是否为平衡二叉树 层序遍历 代码总览 AVL树的插入(包含更新平衡因子) bool ...

  9. 二叉平衡树(AVL树)从演变、平衡、旋转加练习题逐步分析,看不会过来打我

    想要了解AVL树,就得了解它是怎么演化来的,它并不是凭空创造的一个新数据结构,而是发现其他数据结构的不完美而演变过来的. 二叉查找树 我想二叉排序树结构的起源一定是来源于生活,二叉树只有一个根节点,每 ...

最新文章

  1. Xamarin Anroid App访问网站失败
  2. 云计算市场竞争激烈 亚马逊微软IBM阿里业绩亮眼
  3. java pdf添加透明水印_如何在PDF文件中添加透明水印
  4. apache站点优化——长连接
  5. linux需要检测的系统资源不足,细说Linux 系统优化
  6. 一文了解贪心算法和回溯算法在前端中的应用
  7. Android逆向笔记-使用Android Studio调试Smali代码(方式一)
  8. windows 开启/关闭本地连接的批处理程序
  9. 2018计算机二级c知识,2018全国计算机二级考试C语言常考知识点归纳
  10. python视频压缩算法_Python入门到精通视频,阿里巴巴大力推荐,20行Python代码,无损压缩千百张图片!...
  11. Service Mesh简介
  12. Lingo 的基本使用入门
  13. 如何获取EasyCVR平台设备通道的RTMP视频流地址?
  14. 堆排序算法思路以及Java实现
  15. TouchGFX如何校准电阻触摸屏
  16. 编译原理之确定有限自动机的最小化
  17. 零基础如何从零开始运营微信公众号
  18. 一种 Python 获取时间序列数据集的方式
  19. RS232、RS485及RS422有什么区别
  20. 爬取前程无忧数据,并存入数据库

热门文章

  1. R语言使用比例-位置图(Scale-Location Plot)和Breusch-Pagan检验验证回归模型残差的同方差性(方差齐性)
  2. R语言多因素方差分析及评估假设检验
  3. plotly自定义股票数据绘图
  4. R使用abline()函数在图中添加额外的直线
  5. R操作MySQL数据库创建表、删除表、增删改查(CRUD)
  6. 32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?
  7. Graph Convolutional Neural Networks for Predicting Drug-Target Interactions
  8. ikbc键盘自动打字_键盘按斤卖,一斤一百块?IKBC W200机械键盘简晒
  9. ffmpeg 压缩视频
  10. GoogleNet - Going deeper with convolutions