AVL树的插入
关于AVL树的插入,其实是一个比较复杂的问题,主要是在于他对于“旋转”这一概念,对于这一概念其实我感觉很多博主讲的都不是很明白,包括CHATGPT,也试了,但是也没有比较清楚的解释,他们主要集中在一种比较简单的情况,即没有任何子树的情况,如下所示


对于这种最基本的平衡维护,确实不是一件困难的事情,这个可以作为一种技巧,来帮助我们快速的来去得到答案。所以在这里,我会先从最基本的情况来去讲解这里是怎么个操作的流程,这里会不用“旋转”这一概念来解释平衡的维护,而是一种更加简单易懂的方式来讲解。
(注 本次的博客会在发布之后补充上代码,现在不会添加代码,只是会提供相关的概念)
其实个人觉得看到不错的是这个,推荐一下便于大家学习https://www.hello-algo.com/chapter_tree/avl_tree/#2_1
OK。可恶的作者终于把他的废话说完了,现在开始要说内容了。
首先是对于这里的基本情况。
如下所示

可以看到是有四种情况,这里即是插入节点后失衡的四种情况。对于这四种情况,我们可以对他们做一个分类,分为直线型和弯线型。
为什么叫直线型和弯线型,其实在这里是非常明显的(这里当然很明显,但是对于实际的节点插入来说就不是特别明显了),我们将插入的节点向上回溯,然后一直到第一个失衡点,这样子来看,到达第一个失衡点之后,向下往插入点的方向标记三个单位,这个三个点就是接下来要主要操作的三个点了。
如下所示,

可以看到如上面的图片所示,可以知道,他为什么叫直线型和弯线型。那么接下来,就是如何对他们做操作呢,其实也是很简单的。
对于直线型,我们要做的就是把他掰弯,为了方便起见,我们将这三个点由上到下分别叫做爷爷,父亲,儿子。那么要做的是把爷爷弯折至和儿子一个高度,让后再将父亲给连接上。
对于弯线型,则是不一样,我们要先将它弄直,然后再像直线型一样操作。对于再将弯线型弄直的过程中,由于他是一个二叉树,所以要将父亲和儿子的值给交换一下,这样子才可以让其维持二叉树的特点。
那么这种最基本的情况讲完了,但是这并不足以应付一些复杂的情况,如果说存在子树的话,那么怎么去移动父亲,儿子,爷爷三个点的子树就成为了问题。
那么如下所示

对于这样子一个二叉树,我应该怎么去维护他的平衡性。可以按照如下的操作。
首先我们要先找到他的不平衡点,我们去依次标记他的子树的大小,如下所示

可以知道当前的为直线型,爷爷,父亲,儿子分别为4,7,15三个点,那么由于是直线型,那么父亲必然是要作为接下来的新根节点,但是问题是此时,由于他是在中间位置,如果我直接去做弯折的操作,就会导致他的子树无法处理(总不能直接变成三叉树吧),所以这个时候,我需要做的是对他的子树进行转移。
如何转移他的子树呢,对于由于此时爷爷节点在下移了之后,他的位置有一个子树的位置是空了,所以在这里可以把子树转移到他的爷爷节点下面,转移之后,如下所示

实际上,我们就是将节点转移到了爷爷上面,并且把父亲作为了新的根节点。
那么对于有子树的弯折型,又应该怎么处理呢,可以参考如下的例子。在这里,已经标记好了弯折点。

在这里,接下来要做的就是去首先将它给掰直,在掰直的过程中,可以发现由于16的存在,影响了掰直,所以在这里的处理措施是将将7移动到与6连接的地方,在这之后,就是将15节点移动下来,并将14节点拼接到15节点上,这样,就完成了一次移动,完成后的结果如下所示。
之后,我们可以看到他接下来就可以弄弯了。

这样子,我们就可以实现对他的平衡的维护了。
最后总结一下吧。
1.对于直线型,我们要做的是将它儿子的那个不在线上的子树给他的父亲节点,这样子就可以完成平衡的维护
2.对于弯线型,则可以去将其儿子的子树给到父亲节点,然后将儿子放在中间位置,在这之后,就是做和直线型一样的操作。
AVL树的插入的更多相关文章
- AVL树的插入操作(旋转)图解
=================================================================== AVL树的概念 在说AVL树的概念之前,我们需要清楚 ...
- AVL 树的插入、删除、旋转归纳
参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339 1126号注:先前有一个概念搞混了: 节点的深度 Depth 是指从根 ...
- AVL树的插入和删除
一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...
- 【动画笔记】数据结构-AVL树的插入操作
本笔记前置知识: 二叉搜索(排序)树及其插入操作. 本文主要围绕AVL树的平衡因子.纸上做题思路.失衡类型(LL/RR/LR/RL).失衡调整方法.插入后回溯这几部分知识点展开. 注: 本笔记中的平衡 ...
- AVL树的插入删除查找算法实现和分析-1
至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法. 因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和 ...
- AVL树的插入与删除
AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少.关键是理解什么时候应该左旋.右旋和双旋.在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下. 1 ...
- 第七章 二叉搜索树 (d2)AVL树:插入
- 创建AVL树,插入,删除,输出Kth Min
https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 没有考虑重复键,可以在结构体内加一个int times. 没有考虑删除不存 ...
- 二叉查找树(BST)、平衡二叉树(AVL树)(只有插入说明)
二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点, ...
- 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作
AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1). 也就是说,AVL树,本质上 ...
随机推荐
- Python311新特性-特化指令specializing adaptive interpreter-typing-asyncio
Python3新特性 python3.11增加了许多特性,让python更快更加安全,本文从应用层面来讲一下python3.11的这些新特性 特化自适应解析器是什么,如何利用特化写出更高性能的代码 如 ...
- 锋利的在线诊断工具——Arthas
导航 前言 火线告警,CPU飚了 服务重启,迅速救火 黑盒:无尽的猜测和不安 Arthas:锋利的Java诊断工具 在线追踪Cpu占比高的代码段 代码重构,星夜上线,稳了 结语 参考 肮脏的代码必须重 ...
- .NET云原生应用实践(五):使用Blazor WebAssembly实现前端页面
本章目标 使用Blazor WebAssembly实现管理"贴纸"页面 集成认证与授权机制 如果你对Blazor WebAssembly的使用不感兴趣,可以跳过本章的阅读.你也可以 ...
- 多校A层冲刺NOIP2024模拟赛20
多校A层冲刺NOIP2024模拟赛20 昨天晚上打 ABC 了,所以今天才发. T1 星际联邦 直接上 菠萝(Borůvka)算法就行了,当然还可以用线段树优化 prim算法,但是没打过只是口胡:就是 ...
- 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。 找出nums中长度为k的所有子
2024-11-13:求出所有子序列的能量和.用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值. 找出nums中长度为k的所有子 ...
- IDEA方法模板、类模板设置记录
类模板 设置入口 Mac:common+,进入设置->Editor->File and Code Templates->Includes 模版代码 /** * todo * * @a ...
- vue3:computed
扫码或者点击文字后台提问 原文: https://mp.weixin.qq.com/s/36dd--oj6jmkZblfJRh4iw computed 支持选项式写法 和 函数式写法 1.选项式写法 ...
- K均值聚类和代码实现
K均值聚类是一种无监督学习分类算法. 介绍 对于$n$个$m$维特征的样本,K均值聚类是求解最优化问题: $\displaystyle C^*=\text{arg}\min\limits_{C}\su ...
- pycharm之常用插件
参考:http://pycharm.iswbm.com/zh_CN/latest/ 1. Key Promoter X 如果让我给新手推荐一个 PyCharm 必装插件,那一定是 Key Promot ...
- uniapp select组件
1.前言 官方的picker组件不能禁用某个下拉项,所以就有了这个下拉组件 组件只适配了宽屏模式,效果参照element-ui的select组件 demo地址:lianlizhou / ep-sele ...