记录一下红黑树的学习笔记
学习视频:
红黑树定义及插入
红黑树删除
视频讲的非常好非常详细,动画非常形象,强烈建议去看看。本文的图文来自视频
红黑树是一种自平衡的二叉搜索树。所以红黑树首先必须是一棵二叉搜索树(左根右),其次满足以下三条性质:
首先插入的新节点默认为红色。因为如果默认为黑色,必然导致这条路径多一个黑色节点,违反了黑路同性质。
插入新节点如果破坏了红黑树性质,分为三种情况进行调整:
对于第一种情况,是最简单的。如果插入的是根节点,违反了根叶黑性质,直接把他变成黑色即可。后面两种情况就要根据插入节点的叔叔颜色判断。
第二种情况,如果叔叔是红色,就需要按叔父爷变色,爷爷变插入节点进行变化,变化后再判断爷爷节点是否符合红黑树性质。注意,下图没有画出叶子节点
第三种情况要复杂些。需要先旋转再变色,旋转根据AVL中的(LL型、RR型、LR型、RL型)进行判断。
例如下图,是LL型的调整过程,RR型类似
下图是LR型的调整过程,RL型类似
插入操作容易破坏红黑树的不红红性质
删除是红黑树最难最复杂的操作,删除容易破坏黑路同的性质。总体上也分为三种情况:
看起来好像不复杂,但需要分的情况较多。对于第二种情况,只可能出现一黑一红(红在左子树)和一黑一红(红在右子树)两种。所以实际上是只有左孩子或只有右孩子,那么直接用孩子代替即可。例如下图(没画出空节点),要删除17
对于没有孩子的情况,又需要分删除的节点是黑色还是红色。
如果删除的是红色,因为不会破坏黑路同性质,所以直接删除即可。例如下图,删除23
然后就是最复杂的一种情况,删除的是没有孩子的黑色节点。因为删除的是黑色节点,所以必然会破坏黑路同性质,因此必然要进行调整。注意,这里的孩子是不包括空节点的。(ps:接下来分的情况很多,会有点晕)
这里先引入双黑节点的概念,因为少了一个黑色节点,所以让一个节点算双重黑色,就是双黑节点。如下图
接下来的任务就是要消除双黑节点或者让他变成单黑节点
消除的方法是看双黑节点的兄弟是黑色还是红色。兄弟是黑色节点又要分兄弟至少有一个红孩子(先变色,后旋转)和兄弟的孩子都是黑色两种情况。
对于至少一个红孩子的情况,如下图(展示的是LL型),注意其中r变s,s变p,p变黑指的是r变成s的颜色,s变成p的颜色,p变成黑色,LL型和RR型类似
对于LR型,如下图,RL型类似
对于兄弟的孩子都是黑色的情况,如下图
双黑节点的兄弟是红色的情况:
最后对删除进行一下总结:
上面只是对各种情况进行一个简单的记录,更多例子和细节建议去看这个up主的视频,强推!