前言
早上好,我是彤哥。
上一节,我们一起从二叉树、二叉查找树、平衡树、AVL树、2-3树、2-3-4树、B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图:
我们知道2-3-4的插入、删除、查找元素的原理是相当简单的,那么,我们是不是可以利用2-3-4树来记忆红黑树呢?
答案是肯定的,本节,我们就来看看如何利用2-3-4树来快速掌握红黑树,再也不用死记硬背了~~
好了,让我们进入今天的学习吧。
再忆2-3-4树
我们给出一张图简单地回顾一下上一节关于2-3-4树插入元素N的过程:
关注公主号彤哥读源码,查看上一节的内容。
左倾红黑树、右倾红黑树、AA树
在正式讲解红黑树之前呢,彤哥先来给大家普及几个有意思的概念,分别是左倾红黑树、右倾红黑树、AA树。
图片太小?试试横屏!
请看上图,其实按照红黑树的概念,上面3颗树都是红黑树,而且元素也是一模一样,可以说是同一颗红黑树的不同变种。
细心的同学会发现①和②是同一颗2-3-4树演化而来,③是这颗2-3-4树缩小成2-3树的样子。
那么,到底什么是红黑树呢?
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。
首先,红黑树是一颗二叉查找树,另外,它还必须满足以下五点要求:
- 节点是红色或黑色;
- 根节点是黑色;
- 所有叶子节点是黑色;(叶子节点是NULL节点)
- 每个红色节点的两个子节点都是黑色;(从根节点到每个叶子节点的路径上不能有两个连续的红节点)
- 从任何一个节点到每个叶子节点的所有路径都包含相同数目的黑色节点;
大家不用记这个概念哈,因为确实很难记得住哈,下面彤哥会教大家更简单的方法。
所以,你看上面三个图是不是都是红黑树呢?
并不是啊,因为叶子节点有的是红色的呀。
其实,它们都是红黑树,让我把叶子节点补齐:
你再仔细看看,是不是满足上面五条规则了?!
所以,你看,随便画一颗树,它都可能满足红黑树的定义,因此,为了方便记忆,我们将红黑树分成这么几种类型:左倾红黑树、右倾红黑树、AA树。
左倾红黑树(LLRB,Left-Learning Red-Black Tree),一个节点如果有红色子节点,那么,它的红色子节点是向左倾斜的。
怎么理解呢?
我们还是把上面的null节点干掉哈,叶子节点都是null节点,那是经典红黑树的讲法,到彤哥这里,完全不存在这种要求。
我们来看,一个节点要么有一个子节点,要么有两个子节点,对吧。
如果这个节点有红色的子节点呢,也是一个或者两个,如果只有一个红色子节点的话,那么,这个子节点只能在左边,如果是有两个红色子节点,那就不用管。
所以,整颗红黑树中,如果存在红色节点,那么只能是下面这两种形态:
同理,右倾红黑树(RLRB,Right-Learning Red-Black Tree),也是一样的道理,即红色子节点向右倾斜,它的红色子节点只能是下面这两种形态:
好了,左倾和右倾红黑树都还算比较正常的形态,还有一种变态的红黑树,叫作AA树(AA