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

146.DS补充--红黑树的理解学习

红黑树

废话少讲 主要理解的就是:

  • 红黑树的概念原理
  • 结合例子来手绘理解
  • 结合Java代码来理解

注:知识结合AI和java源代码来理解学习 主要涉及插入的操作 删除过于复杂了

一.红黑树的概念原理

本质其实还是一棵AVL树但是不需要达到完全平衡性
频繁插入删除老是调整代价大 引入红黑树
先看它的规则:

  • 结点只有红色(R)/黑色(B)
  • 根结点必须为黑色(为了防止根乱变)
  • 空NULL节点视为黑色
  • 新插入的结点初始为红色
  • 红节点不能连续(红红不能出现)
  • 从任意节点到叶子节点的黑节点数量必须相同(为了平衡)

看到前面红红连续出现了 就是红黑树要解决的问题
很简单就两个方式:变色/旋转
屏幕截图 2026-05-18 162425
关于旋转等同于AVL平衡二叉树的那四种情况:
image

概念原理就这些 我们需要通过一个过程来手绘真正理解它


二.结合例子来手绘理解

比如插入10 5 1 7 15 20
我们一步一步结合原理概念来理解过程

1.插入10初始为红色 但是根结点必须为黑色
image

2.插入5初始为红色 然后<10左边 现在没啥问题
image

3.插入1初始为红色 通过BST概念排到5左边 出现连续红红的情况了
image
叔叔是null空结点黑的 所以旋转
按照AVL LL右旋
image

4.插入7初始化红色 BST排到10左边再次出现连续红红情况
image
叔叔是红色 需要进行变色 根据规则:叔父黑 爷红
image
爷5是根结点必须为黑

5.插入15初始化为红色 BST排到10右边 没啥问题
image

6.插入20初始化为红色 BST排到15右边 连续红红情况
image
叔叔红色 进行变色:叔父黑 爷红
image
再往上检查没问题 结束

插入的操作:依旧本质AVL平衡二叉树+BST排序二叉树


三.结合Java中的TreeMap理解

截取源码 先看put插入

 private V put(K key, V value, boolean replaceOld) {Entry<K,V> t = root;if (t == null) {addEntryToEmptyMap(key, value);return null;}int cmp;Entry<K,V> parent;// split comparator and comparable pathsComparator<? super K> cpr = comparator;if (cpr != null) {do {parent = t;cmp = cpr.compare(key, t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else {V oldValue = t.value;if (replaceOld || oldValue == null) {t.value = value;}return oldValue;}} while (t != null);} else {Objects.requireNonNull(key);@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;do {parent = t;cmp = k.compareTo(t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else {V oldValue = t.value;if (replaceOld || oldValue == null) {t.value = value;}return oldValue;}} while (t != null);}addEntry(key, value, parent, cmp < 0);return null;}

这个没啥好说的就是BST实现过程

重点核心就是修复出现红红连续的情况如何处理fixAfterInsertion()

private void fixAfterInsertion(Entry<K,V> x) {x.color = RED;while (x != null && x != root && x.parent.color == RED) {if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {Entry<K,V> y = rightOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);x = parentOf(parentOf(x));} else {if (x == rightOf(parentOf(x))) {x = parentOf(x);rotateLeft(x);}setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateRight(parentOf(parentOf(x)));}} else {Entry<K,V> y = leftOf(parentOf(parentOf(x)));if (colorOf(y) == RED) {setColor(parentOf(x), BLACK);setColor(y, BLACK);setColor(parentOf(parentOf(x)), RED);x = parentOf(parentOf(x));} else {if (x == leftOf(parentOf(x))) {x = parentOf(x);rotateRight(x);}setColor(parentOf(x), BLACK);setColor(parentOf(parentOf(x)), RED);rotateLeft(parentOf(parentOf(x)));}}}root.color = BLACK;}

我们重点解读这段代码

首先是插入初始为红色
image

然后循环条件出现红红情况
image

然后第一种情况
image
也就是父结点是爷结点的左孩子
image

然后判断 叔叔是红色 变色
image
则父 叔变黑色 爷变红色

如果叔叔是黑色 旋转 这就是对应AVL
image
如果x是右边 那就是LR情况先左旋后右旋
是左边 就右旋就行 然后变色调整

同样的类比 另一种情况
image
image

最后 root.color = BLACK; 根变为黑色

大致就是这 完全够理解红黑树的应用了 删除有些复杂 考查也概率小 等后续再总结

http://www.zskr.cn/news/1311955.html

相关文章:

  • 开源自动化部署工具deploy-openclaw:架构解析与实战指南
  • NVIDIA Profile Inspector终极指南:免费解锁200+隐藏显卡设置
  • 2026重庆除甲醛公司推荐:高性价比怎么选不踩坑 - GrowthUME
  • 从 LLM 网关角度看 API 中转站选型:token5u 优先的实现思路
  • GPTs商店里的“隐形冠军”:被低估的5个GitHub Star>2.4k、日均调用量破12万次的开源可部署GPT(附Docker一键部署脚本)
  • 2026年重庆除甲醛认准这3家,靠谱又安心 - GrowthUME
  • STM32 PVD中断防数据丢失实战:手把手教你配置2.9V阈值与紧急保存逻辑
  • 保姆级教程:在STM32CubeIDE中配置STM32F407的UART4 DMA收发(含代码生成与手动优化)
  • 基于MSP430的太阳能追踪与智能调光系统设计与实现
  • 18. LangChain输出解析器实战:从大模型输出到结构化数据的转化
  • 25202214-软件工程凌云版三次作业集总结 - CR
  • Go泛型实战:从类型安全到代码复用的设计跃迁
  • 全网最详细的数据库基础指南
  • 打破生态壁垒:在Windows上无缝安装Android应用的创新方案
  • 如何3步彻底修复Windows游戏兼容性问题:DirectDraw兼容性终极解决方案
  • 嵌入式Linux嵌入式Linux驱动开发:板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环
  • NotebookLM提示词工程白皮书(社会科学专属版):含17个经IRB审核通过的田野访谈摘要模板
  • 通过 Python 脚本快速接入 Taotoken 并调用多模型完成内容生成任务
  • 面向对象设计与总结(航空配载系列)
  • Vue Vant Cascader异步加载数据实战:从事件困惑到精准控制的省市区街道选择方案
  • pta第一至三次作业总结
  • 【MySQL基础教程】DQL语句详细介绍
  • DeepSeek 强势赋能 OpenClaw 智能能力全面升级
  • NCM解密工具终极指南:简单三步解锁网易云音乐加密文件
  • 5分钟上手Waifu2x-Extension-GUI:AI超分辨率让你的图片视频焕然一新
  • GPTs商店避坑指南:3类97%用户踩过的“伪高星”GPT陷阱,附官方API调用验证法
  • 2026年内蒙古化妆/彩妆/美容美发/美甲美睫学校指南:为何“丽妍”成为行业首选? - 深度智识库
  • 【YOLO目标检测全栈实战】39 多模型流水线:当YOLO遇上OCR和语音合成,如何让四个模型“共线生产”?
  • 学生党福音:一个信用卡搞定AWS Deepracer无限免费训练时长,附CCF比赛实战代码
  • 高校实验室项目如何利用Taotoken的Token Plan套餐控制科研实验成本