news 2026/4/11 11:26:43

红黑树原理以及红黑树旋转和变色

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
红黑树原理以及红黑树旋转和变色

一.红黑树规则

  1. 每个节点要么是红色,要么是黑色
  2. 根节点始终为黑色
  3. 红色节点的子节点必须都是黑色(即不允许出现连续的红色节点)
  4. 从任意节点到其所有空子节点的路径上,包含的黑色节点数量相同

二.红黑树效率

由于红黑树的性质,假设红黑树存在最长路径于最短路径,最长路径最大就是最短路径的2倍

所以N个节点的红黑树 节点数量 N 满足不等式:2^h - 1 ≤ N < 2^(h+1) - 1 h是最短路径长度

也就意味着时间复杂度是logN

三.红黑树结构

插入新节点

while(parent&&parent->_col==RED){ Node*grandfather=parent->_parent; if(grandfather->_left==parent){ //说明uncle在右边 Node*uncle=grandfather->_right; //如果叔叔节点也是红色且存在 if(uncle&&uncle->_col==RED){ parent->_col=uncle->_col=BLACK; grandfather->_col=RED; cur=grandfather; parent=cur->_parent; } else{ //此时叔叔节点是黑色或者不存在 //需要旋转 if(cur==parent->_left){ RotateR(grandfather); parent->_col = BLACK; grandfather->_col = RED; //与父节点偏向相同只需要右旋 } else{ RotateL(parent); RotateR(grandfather); cur->_col = BLACK; grandfather->_col = RED;//先左旋后右旋 } break; } } else{ Node*uncle=grandfather->_left; if(uncle&&uncle->_col==RED){ parent->_col=uncle->_col=BLACK; grandfather->_col=RED; cur=grandfather; parent=cur->_parent; } else{ if(cur==parent->_right){ RotateL(grandfather); parent->_col = BLACK; grandfather->_col = RED; //与父节点偏向相同只需要左旋 } else{ RotateR(parent); RotateL(grandfather); cur->_col = BLACK; grandfather->_col = RED;//先右旋后左旋 } break; } } }

情况一:当叔叔节点存在且是红色时

此时不需要旋转只需要将父节点和叔叔节点变成黑色即可,再将父节点的父节点变成红色向上继续调整

情况二:当叔叔节点不存在或存在且为黑色时

此时需要旋转,旋转逻辑分为两种单旋或是双旋。

如果此时插入的新节点在祖父节点的左树且是父节点的左侧,说明结构偏向一边只需要向右单旋即可,如果插入在祖父左侧却在父节点右侧,则需要左旋后右旋。反之一样。

旋转代码

void RotateR(Node * parent) { Node* subL = parent->_left; Node* subLR = subL->_right; parent->_left = subLR; if (subLR) subLR->_parent = parent; Node* pParent = parent->_parent; subL->_right = parent; parent->_parent = subL; if (parent == _root) { _root = subL; subL->_parent = nullptr; } else { if (pParent->_left == parent) { pParent->_left = subL; } else { pParent->_right = subL; } subL->_parent = pParent; } } void RotateL(Node * parent) { Node* subR = parent->_right; Node* subRL = subR->_left; parent->_right = subRL; if (subRL) subRL->_parent = parent; Node* parentParent = parent->_parent; subR->_left = parent; parent->_parent = subR; if (parentParent == nullptr) { _root = subR; subR->_parent = nullptr; } else { if (parent == parentParent->_left) { parentParent->_left = subR; } else { parentParent->_right = subR; } subR->_parent = parentParent; } }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 6:33:31

大模型微调技术详解:从全参数微调到RLHF的演进与应用

文章系统介绍了大模型微调技术的发展历程&#xff0c;从2018年全参数微调到2023年的偏好对齐技术&#xff0c;包括特征提取、Adapter、LoRA、提示微调、指令微调等方法。分析了各种微调技术的原理、特点和适用场景&#xff0c;解释了微调为何在大模型时代取代从零训练&#xff…

作者头像 李华
网站建设 2026/4/10 23:13:16

CC-Switch深度解析与Mac安装全指南:一键搞定AI编程工具配置切换

文章目录目录一、CC-Switch核心解析&#xff1a;为什么它能成为开发者必备&#xff1f;1. 工具定位与核心价值2. 核心功能亮点3. 与传统配置方式对比二、Mac安装全流程&#xff1a;从下载到启动零踩坑1. 安装前提准备2. 两种安装方式&#xff08;任选其一&#xff09;方式一&am…

作者头像 李华
网站建设 2026/4/2 16:20:12

兴趣岛1元试课靠谱吗?如何运作?拆解其在线教育系统逻辑

兴趣岛靠谱吗&#xff1f;在信息爆炸的时代&#xff0c;消费者面对任何商业模式时&#xff0c;往往容易陷入“非黑即白”的极端判断。近期&#xff0c;围绕兴趣岛的“一元试课”模式&#xff0c;社交媒体上出现不少争议声音&#xff0c;部分不好怀疑的声音将其标签化为“营销套…

作者头像 李华
网站建设 2026/4/9 23:40:56

【计算机毕业设计案例】机器学习基于python-AI深度学习对狗表情训练识别基于python-AI深度学习对狗表情训练识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/10 12:49:01

深度学习毕设项目推荐-基于python-AI深度学习对狗表情训练识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华