可视化RBTree 红黑树
RB树,平衡二叉B树,
介绍
红黑树是一种自平衡二叉搜索树,其中每个节点都有一个额外的位,并且该位通常被解释为颜色(红色或黑色)。这些颜色用于确保树在插入和删除期间保持平衡。虽然树的平衡并不完美,但减少搜索时间并将其保持在 O(log n) 时间左右就足够了,其中 n 是树中元素的总数。
特点
1.红黑节点
2.根是黑色
3.叶子黑色(Null)
4.红色节点必须有黑色子节点
5.任意节点到叶子包含黑色节点数目相同
插入操作情况总结(数据结构可视化网址)
- 当前节点是根节点:把根节点颜色变成黑色
- 当前节点的父节点是黑色:保持不变
- 当前节点的父节点是红节点,并且当前节点的叔叔节点是红节点: 把父节点和叔叔节点改为黑色,把祖父节点该成红色,把祖父节点当成当前节点,继续向上判断
- 当前节点的父节点是红节点,并且当前节点的叔叔节点不是红节点:四种情况
- 祖父节点->父节点->当前节点(一直向右):左旋操作,父节点改为黑色,之前的祖父节点改为红色;
- 祖父节点->父节点->当前节点(一直向左):右旋操作,父节点改为黑色,之前的祖父节点改为红色;
- 祖父节点->父节点->当前节点(先左再向右):当前节点先左旋,再右旋,然后当前节点改为黑色,之前的祖父节点改为红;
- 祖父节点->父节点->当前节点(先右再向左):当前节点先右旋,再左旋,然后当前节点改为黑色,之前的祖父节点改为红;
练习1顺序: 1 2 3 4 5 6 7 8 9 10
- 1红色插入 根结点,变黑
-
2插入1右边,
-
3插入2右边,3的叔叔节点非红,左旋,之前父节点2改为黑色,之前祖父节点1改为红色
(断开1和2,2上1下,1和2颜色变换)2黑根,1红3红,
-
4插入,3右边,4的叔叔节点1是红,变3和3的同级节点(节点4的叔叔节点1)为黑色,祖先节点变红,根结点变黑,
- 5插入,4右边,5的叔叔节点非红,左旋,4节点由红变黑,3节点由黑变红,
- 6插入,5右边,叔叔节点红色,进行换色,35叔父节点变色变黑,祖先节点4变红,
- 7插入,6右边,叔叔节点非红,左旋,父节点6变黑,祖父节点5变红,
- 8插入,叔叔节点红色,变色,57叔父节点变黑,6祖父节点变红,46都红,6的叔叔节点1为黑,左旋,父节点4变黑,2染红,
- 9插入 叔叔节点黑,左旋,变色
- 10插入,叔叔节点红,变色,7 9 黑,8红,红色相连,叔叔红节点,变色,26黑,4红,4根节点变黑。
最终红黑树(显示叶子结点)
练习2倒序: 10 9 8 7 6 5 4 3 2 1
- 10红色插入 根结点,变黑
- 9插入10左边,
- 8插入9左边,8的叔叔节点非红,右旋,之前父节点9改为黑色,之前祖父节点10改为红色 (断开10和9,9上10下,9和10颜色变换)9黑根,10红8红,
- 7插入8左边,7的叔叔节点10是红,变8和8的同级节点(节点8的叔叔节点10)为黑色,祖先节点变红,根结点变黑,
-
6插入,7右边,6的叔叔节点非红,右旋,7父节点变黑,8祖父节点变红,
-
5插入,6右边,5的叔叔节点红色,进行换色,6和8叔父节点变黑,祖先节点7变红,
- 4插入,5右边,叔叔节点非红,右旋,父节点5变黑,祖父节点6变红,
- 3插入,叔叔节点红色,变色,叔父节点4和6变黑,祖父节点5变红,5和7都红不可以相邻,把5当作当前节点,5的叔叔节点10非红,右旋,父节点7变黑,祖父节点9变红,
- 2插入 其叔叔节点非红,右旋,变色,父节点3变黑,祖父节点4变红
- 1插入,其叔叔节点是红,变色,叔父节点4和2变黑,祖父节点3红; 3和父节点5红色相连不可 -> 把3当作当前节点,其叔节点9是红,则变色,叔父节点5和9变黑,祖父节点7变红因为是根节点,根节点7变黑。
最终红黑树(显示叶子结点)
练习3乱序: 2 10 5 6 7 9 4 1 3 8
- 节点2插入,根结点2变黑
- 节点10插入,放节点2右边,
- 节点5插入(比10小),放节点10左边,当前节点5的叔叔节点非红,又因祖-〉父-〉我是先右后左,所以先右旋(5左旋,5和10调换顺序)后左旋(当前节点变为10其父节点5变黑,其祖节点2变红)
- 节点6插入,放节点10左边,当前节点6的叔节点2是红,所以变色(叔父节点2盒10变黑,祖节点5变红),节点5是根节点,变色(节点5变黑)
- 节点7插入(比6大),放节点6右边,当前节点7的叔节点2非红,又因祖-〉父-〉我是先左后右,所以先左旋(7左旋,6和7调换顺序)后右旋(当前节点7的父节点变黑,其祖节点变红)
- 节点9插入(比10大),放节点10左,当前节点9的叔节点6是红,所以变色(其叔父节点6和10变黑,祖节点7变红)
- 节点4插入(比7小比2大),放节点2右边
- 节点1插入(比2大比4小),放节点4左边
- 节点3插入(比2小),放节点2左,因红节点不能相邻,其叔节点1是红,故变色(叔父节点1和4变黑,祖节点2变红)
- 节点8插入(比9小),放节点9左,因红节点不能相邻,其叔节点1非红,故右旋(其父节点9变黑,祖节点10变红)
最终红黑树(显示叶子结点)
大家快来试试吧