学习: 在这篇文章中,我们主要学习三个点
红黑树是一种自我平衡的红黑二叉树,红黑树满足所有的二叉查找树的属性,同时一些额外的属性被添加在红黑树中,红黑树的每个节点是黑色或则红色,它的高度是O(logn),n是这颗树的节点数量
需要被插入的数据应该被标记为红色 并不是每一个插入的节点都会造成不平衡,但是如果造成了不平衡,需要删除不平衡,删除操作依赖于这棵树之前的布局 当不平衡发生时,通常会使用
为了更深刻的理解插入操作,让我们先做如下假设 a. u是最新需要插入的节点 b. p是u节点的父亲节点 c. g是u节点的祖父节点 d. Un是u节点的叔叔节点
一个新节点插入之前这棵树肯定是一棵平衡数,但是当我们插入新节点的时候就会打破平衡,这时我们首先会采用转换颜色,如果还没有删除平衡,我们在滚动节点让树达到平衡
不平衡的发生主要是和叔叔节点相关,如果叔叔节点是红色的,那么有四种场景需要处理,可以通过重新调换颜色可以删除不平衡
因为p是g的左节点,u是p的右节点,所以称为左右不平衡,不平衡的原因是因为插入的节点必须是红色的,但是红色节点不能相邻,所以需要其中一个变为黑色,所以需要重新标记颜色
删除左右不平衡可以通过下面几步注意 如果g是根节点则不需要变色 为什么这三个步骤能够删除不平衡,因为转换p和Un能够保证以g为根节点的两条线的黑色节点数量是相同的,但是如果g不是根节点,那么其实每条线黑色节点+1,需要减1,所以g的颜色需要变成红色,之后三个案例类似
因为p是g的左节点,u是p的左节点,所以称为左右不平衡,不平衡的原因是因为插入的节点必须是红色的,但是红色节点不能相邻,所以需要其中一个变为黑色,所以需要重新标记颜色 复制代码删除左右不平衡可以通过下面几步
因为p是g的右节点,u是p的右节点,所以称为左右不平衡,不平衡的原因是因为插入的节点必须是红色的,但是红色节点不能相邻,所以需要其中一个变为黑色,所以需要重新标记颜色
删除左右不平衡可以通过下面几步
因为p是g的右节点,u是p的左节点,所以称为左右不平衡,不平衡的原因是因为插入的节点必须是红色的,但是红色节点不能相邻,所以需要其中一个变为黑色,所以需要重新标记颜色
删除左右不平衡可以通过下面几步不平衡在uncle节点是黑色的时候同样也会发生,下面有四种场景将会被提及,这四种场景的不平衡能够被通过移动节点删除 LR 不平衡 LL 不平衡 RR 不平衡 RL 不平衡
a. p滚动占据g的位置,g滚动占据Un的位置 b. p重新标记为黑色,g重新标记为红色
这个逻辑也比较好理解,主要是保证以g为根节点的两个分支黑色节点数量不发生变化,后面类似
a. u滚动两次占据g的位置,g成为u的子节点 b. 重新标记u为黑色,g和p为红色
提醒:
插入节点的默认颜色一定是红色 如果Un节点不存在则按照黑色节点的逻辑进行处理
(原文链接)[www.includehelp.com/data-struct…]