红黑树

红黑树定义和性质

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质

  • 性质1:每个结点要么是黑色,要么是红色。
  • 性质2:根结点是黑色。
  • 性质3:每个叶子结点(NIL,空结点)是黑色。
  • 性质4:每个红色结点的两个子结点一定都是黑色。(不会有连续的红色结点)
  • 性质5:任意结点到叶子结点经过的黑色结点数目相同。

问题:

红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?

 

红黑树也是二叉查找树,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。

红黑树能自平衡,它靠的是三种操作:左旋、右旋和变色。

  • 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。
  • 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。
  • 变色:结点的颜色由红变黑或由黑变红

 

 

 

可以发现旋转操作是局部的。另外可以看出旋转能保持红黑树平衡的一些端详了:当一边子树的结点少了,那么向另外一边子树“借”一些结点;当一边子树的结点多了,那么向另外一边子树“租”一些结点。

 

红黑树插入

插入操作包括两部分工作:一查找插入的位置;二插入后自平衡。

新插入的结点颜色总是红色的,(如果是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。)为了保证红黑树的性质能继续保持,再对有关结点重点着色并旋转。

 

 插入情景1:红黑树为空树

处理:把插入结点作为根结点,并把结点设置为黑色。

插入情景2:插入结点的Key已存在

处理:那么把插入结点设置为将要替代结点的颜色,再把结点的值更新就完成插入。

插入情景3:插入结点的父结点为黑结点

处理:由于插入的结点是红色的,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。

插入情景4:插入结点的父结点为红结点

如果插入结点的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。

 

原文链接:30张图带你彻底理解红黑树 - 简书 (jianshu.com)

posted @   danielzzz  阅读(62)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示