news 2026/4/3 7:47:28

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

作者头像

张小明

前端开发工程师

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/3/20 15:53:13

千元出头,权限全开!实测最近卖爆的拾光坞G2到底如何!

引言时间已经来到了26年的一月中旬了&#xff0c;从上个月某N150型号预售到现在&#xff0c;熊猫依然是没看到网上有什么用户的测评&#xff0c;当然别人提前就说了是预售模式&#xff0c;所以这一点没啥喷的。在同样的配置下&#xff0c;N150的另一款机型因为其价格的优势最近…

作者头像 李华
网站建设 2026/3/28 8:58:33

如何查看相册访问数据?看这里!

&#x1f64b;如何查看相册成员谁看过内容&#xff0c;喜好哪些内容&#xff0c;下载了哪些图片&#xff1f;&#x1f449;支持的⬇️下面将介绍如何查看访客足迹数据&#xff1a;1️⃣打开土著相册小&#x1f34a;序&#xff0c;点击目标相册&#xff0c;进入相册2️⃣点击底部…

作者头像 李华
网站建设 2026/3/27 13:04:56

化学研究智能体:AI架构师必须掌握的负载均衡策略

化学研究智能体规模化部署&#xff1a;AI架构师必学的负载均衡策略 引言&#xff1a;化学智能体从实验室到生产的算力瓶颈 当你花费数月时间训练出一个能预测分子性质的化学智能体&#xff0c;从实验室的单节点测试走向生产环境时&#xff0c;可能会遇到这样的场景&#xff1a;…

作者头像 李华
网站建设 2026/3/24 22:31:06

计算互相关积分电平的函数

function [IL_linear, IL_dB] myIL (x, y, plotEnable) %% 计算积分电平 % 2026.1.11 2A438 % 自己动手编写的波形的互相关的IL积分旁瓣电平、PIL积分电平 % 输入&#xff1a; % x: 输入信号1 % y&#xff1a; 输入信号2 % mlb&#xff1a; 主瓣宽度&…

作者头像 李华