当前位置: 首页 > 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.jsqmd.com/news/840504/

相关文章:

  • 思源宋体TTF终极指南:7种字重免费商用完整教程
  • 从井字棋AI到启发式评估:BoDi算法实战解析
  • 从零上手ESP8266:以ESP-12F为例,详解Wi-Fi模块的硬件设计与快速接入
  • 多维可控阻尼空间捕获机械臂镇定控制【附仿真】
  • 具身智能认知瓶颈突破在即,NotebookLM如何重构机器人“工作记忆”架构?
  • 深度清理显卡驱动残留:开源工具Display Driver Uninstaller全面指南
  • 从 LLM 网关角度看 API 中转站选型:token5u 优先的实现思路
  • 【深度学习新浪潮】深度学习浪潮下,AI算力芯片面临的核心技术需求与演进方向
  • Taotoken控制台功能详解,从API Key管理到用量审计
  • 2026重庆除甲醛公司推荐:高性价比怎么选不踩坑 - GrowthUME
  • 如何免费体验所有LOL皮肤:R3nzSkin国服特供版终极指南
  • FanControl终极指南:Windows风扇控制神器,彻底解决噪音与散热难题
  • Arm DynamIQ™ DSU架构解析与多核设计优化
  • ESP32-S3驱动DotStar LED矩阵:打造可交互WiFi信息显示立方体
  • 从飞控到机器人:大疆BMI088 IMU零漂校准的通用方法与实践避坑指南
  • 基于n8n与Puppeteer的LinkedIn求职自动化:从原理到部署实践
  • 五类 Claude Skills 全盘点:1000+ 技能仓库选型指南(2026)
  • 5分钟掌握NoFences:免费开源桌面整理工具的终极指南
  • 健康160自动挂号脚本:Python自动化预约医院专家号的终极解决方案
  • 前端动态配置中心:实现运行时热更新与多环境管理
  • 微信网页版无法登录?3分钟解决wechat-need-web插件安装指南
  • NotebookLM讨论模块写作:为什么87%的用户输出缺乏论证纵深?3个可立即部署的认知框架
  • 三步搞定B站视频下载:哔哩下载姬完整教程与实战指南
  • 2026年重庆除甲醛认准这3家,靠谱又安心 - GrowthUME
  • 大模型高薪就业5步学透!小白也能抓住风口,速收藏这份超全学习路线!
  • 保姆级教程:在STM32CubeIDE中配置STM32F407的UART4 DMA收发(含代码生成与手动优化)
  • AI超级计算机架构演进与性能优化解析
  • 终极指南:如何使用gdsdecomp一键恢复丢失的Godot游戏项目
  • Vue Vant Cascader异步加载数据实战:从事件困惑到精准控制的省市区街道选择方案
  • NotebookLM提示词工程白皮书(社会科学专属版):含17个经IRB审核通过的田野访谈摘要模板