红黑树的定义及插入操作
红黑树的定义
- 红黑树的基本特性:
- 节点颜色要么是黑色要么是红色。
- 根节点必须为黑色
- 所有的叶节点也必须为黑色(这里的叶节点指的是树的null节点),如下图黑方块即为叶节点。
- 红色节点的两个子节点必须为黑色节点,即不能出现两个连续的红色节点。
- 从任意节点到其所有叶节点的路径上,必须具有相同数量的黑色节点。如上图从根节点开始,不管到哪一个叶节点,其经过的黑色节点数量始终是3(包括叶节点)。
- 红黑树以上的特性使得红黑树最长的路径永远不会超过最短路径的两倍,该自平衡特性使得它在最坏情况下依然能够保持较高的操作效率。(因为每条路径上的黑色节点数量相同,最差情况下每两个黑色节点之间都有一个红色节点,也就是最长路径,那也就意味着这条路径比其他路径多出来就是那几个红色节点,因此最大不会超过两倍)
红黑树的插入操作
- 红黑树新插入的节点默认为红色,原因是因为插入前所有的路径上的黑色节点数量相同,如果以黑色插入,那么这条路径上会多出来一个黑色节点,违反了红黑树的特性。
- 某些情况下,可能会在新插入的红色节点下面又添加了一个红色节点,这个时候就违反了红黑树性质,因此需要对红黑树进行调整,如下图:
- 因此对于新插入的节点,有两种情况违反了红黑树性质:
- 插入节点为根节点时:即第一次插入节点,此时节点为红色,这个时候直接把它变为黑色就可以。
- 在红节点下又插入了一个红节点,此时需要根据其uncle node(叔节点)的颜色进行调整。
- 插入节点的叔节点为红色:(此时父节点也为红色,父节点的父节点即爷节点只能是黑色)需要对叔父爷节点进行变色。即叔父节点从红色变为黑色,爷节点从黑色变为红色。此时需要从爷节点开始查看是否违反了红黑树性质,如爷节点是根节点,因此需要将爷节点变回黑色。注意:红黑树允许存在连续的黑节点。
- 插入节点的叔节点是黑色:此时需要进行旋转操作(LL,RR,LR,RL)。
- LL:右旋操作:以爷节点为旋转点进行右旋,然后对旋转中心点和旋转点进行变色。
- RR: 左旋操作:同样以爷节点为旋转点进行左旋,然后对旋转中心点和旋转点进行变色。
- LR:先左旋左孩子节点然后右旋爷节点,然后对旋转中心点和旋转点进行变色。
- RL:先右旋右孩子节点然后左旋爷节点,然后对旋转中心点和旋转点进行变色。
笔记参考了B站视频,链接:【红黑树 - 定义, 插入, 构建】https://www.bilibili.com/video/BV1Xm421x7Lg?vd_source=1ce73975599bec062ce090b9ea212938