当前位置: 首页 > news >正文

AVL树 和 红黑树 的插入算法

1.AVL树

按照二叉搜索树的规则找到要插入的位置并插入,插入过后看是父节点的左还是右孩子,然后把父节点的平衡因子-1或+1,调整后如果父节点的平衡因子是0,那就说明这颗子树的高度插入前后不变,上面的就不用调整平衡因子了,到此结束。如果调整后如果父节点的平衡因子是1或-1,那就说明该子树的高度变化了,那就往上走。走了之后看是左孩子还是右孩子,然后给父节点的平衡因子-1/+1,然后看调整后的结果,如果是0或+/-1那和上一次处理一样,不再多说,如果是+/-2,那就开旋~,记该节点为Parent

1.parent节点平衡因子+2

那说明右边高,那就看看右边怎么个事,看右孩子的平衡因子

a.右孩子subR的平衡因子是+1

那说明还是右边高,直接左旋parent节点,subR平衡因子是变成0,parent平衡因子变成0

b.右孩子sub的平衡因子是-1

这种情况要先变成完全不平衡那种,即先右旋subR节点,然后就变成了上面那种完全不平衡的样子,然后左旋parent节点,旋转很简单,平衡因子有点难调。我们要根据subRL,也就是subR的左孩子来调整平衡因子,

如果subRL的平衡因子是0,subRL=0  parent=0  subR=0

如果subRL的平衡因子是1,subRL=0  parent=-1  subR=0

如果subRL的平衡因子是-1,subRL=0  parent=0  subR=1

2.parent节点平衡因子-2

思考方式和+2一样

2.红黑树

按照二叉搜索树的方式找到要插入的位置并插入,节点默认应该是红色而不是黑色,因为红色插入的话不一定会破坏红黑树的规则,而黑色节点插入一定会破坏每条路径上黑色节点个数相同这个规则。插入红色节点后,如果父节点是黑色,那就什么规则都没破坏,结束了。如果父节点是红色,那不能有相邻红色节点,所以要调整,插入这个结点之前应该满足是红黑树,所以父节点是红色说明爷爷节点一定是黑色,这时的关键就是叔叔节点也就是爷爷结点的另一个子节点

1.叔叔节点是红色

那直接把父节点和叔叔节点变成黑色,爷爷节点变成红色,然后继续往上调整,爷爷节点就变成了新加入的红色节点,正如一开始的孙子节点一样

2.叔叔节点是黑色或不存在

这个时候要开旋了~

爷爷节点记为parent,

a.假如父节点是subL

也就是爷爷节点的左孩子,然后当前节点subLL,也就是父节点的左节点,那就右旋parent,然后parent变为红色,父节点变为黑色;当前节点是subLR,也就是当前节点是父节点的右孩子,那就先左旋subL,变成上一种情况那种样子,然后右旋parent,改parent为红色,subL为黑色

b.假如父节点是subR

然后分类当前节点如上

http://www.xdnf.cn/news/295489.html

相关文章:

  • 模拟芯片设计中数字信号处理一些常用概念(一)
  • Agent2Agent(谷歌A2A)协议原理讲解
  • Linux 文件系统深度解析
  • (二)MMA(整洁架构)
  • 中阳策略:如何从K线行为中提取交易逻辑信号?
  • spring中spring-boot-configuration-processor的使用
  • wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API
  • 动态规划之子序列问题1
  • n8n中Wait节点的使用详解:流程暂停与恢复的实战指南
  • CodeQL-CLI工具小白入门
  • hp主机安装ubuntu 22.04版本并换阿里源
  • 【Unity】一个AssetBundle热更新的使用小例子
  • n8n 中 Compare Datasets 节点使用详解
  • 怎么使用nacos作注册中心 + 配置中心。
  • PCA降维详解
  • 信息安全导论 第八章 入侵检测技术
  • 手表关于MPU6050中的功能实现
  • 深入理解C语言中的内存区域:堆、栈与变量存储空间详解
  • Python 文件操作详解:从基础到实践
  • 面向对象与过程介绍
  • Java学习手册:Hibernate/JPA 使用指南
  • Oracle OCP认证考试考点详解083系列08
  • 高速接口:PCIe 3.0 Link Training的详细过程
  • 5.4 - 5.5Web基础+c语言拓展功能函数
  • MyDB - 手写数据库
  • Spring 框架的底层原理
  • 【Fifty Project - D22】
  • 三维重建(二十一)——第二步和第三步
  • 相机biaoding
  • 进程与线程:06 操作系统之“树”