news 2026/6/10 16:47:10

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

作者头像

张小明

前端开发工程师

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/6/10 15:04:33

我们如何把“配环境一天”缩短到“3秒启动”?

我写了十年代码&#xff0c;热情被磨灭的瞬间&#xff0c;往往不是因为一个复杂的算法&#xff0c;而是因为那些无穷无尽的琐事。新同事入职&#xff0c;第一天基本废了&#xff0c;全在配环境。我的 MacBook 风扇狂转&#xff0c;就因为跑了个复杂的后端项目。最怕听到那句“在…

作者头像 李华
网站建设 2026/6/10 13:20:53

AI架构的云原生设计:AI应用架构师如何利用云服务优化架构?

AI架构的云原生设计:AI应用架构师的云端优化实战手册 关键词:AI架构、云原生、MLOps、弹性计算、分布式训练、Serverless推理、模型运维 摘要:AI系统从“实验室原型”走向“大规模生产”时,传统架构常陷入训练慢、部署难、运维繁、成本高的困境。云原生技术像一把“魔法钥匙…

作者头像 李华
网站建设 2026/6/10 13:47:53

奥偌医疗设备制造全流程解析:精工铸就医疗安全基石

一、开篇引言在现代化医疗体系中&#xff0c;安全、可靠的医疗设备是保障诊疗行为顺利进行、守护患者生命健康的关键物质基础。作为医疗气体系统解决方案的重要一环&#xff0c;奥偌医疗深知设备制造环节的至关重要性。它不仅是技术方案的物理承载&#xff0c;更是医疗安全防线…

作者头像 李华
网站建设 2026/6/10 13:45:14

选择国产CAD软件,流程顺畅比功能堆砌更实用

之前评估过不少CAD软件&#xff0c;功能列表看得人眼花缭乱&#xff0c;个个都写得天花乱坠。但对我们实际用软件干活的人来说&#xff0c;单个功能再炫酷也没用&#xff0c;要是融不进日常工作流&#xff0c;价值直接打折扣。我们要的不是一堆孤立的工具&#xff0c;是能把设计…

作者头像 李华
网站建设 2026/6/10 15:38:14

出海新机遇:打造海外打车系统的核心逻辑与本地化关键

一、引言&#xff1a;海外出行市场的蓝海机遇在全球数字化转型的浪潮中&#xff0c;出行服务市场正迎来新一轮的国际化扩张。随着国际旅游业的复苏和本地化出行需求的增长&#xff0c;海外打车市场展现出巨大的发展潜力。然而&#xff0c;与国内市场不同&#xff0c;海外市场具…

作者头像 李华