一、红黑树定义
红黑树五条性质:
- 红黑树是每个节点都带有颜色属性的二叉查找树,颜色只能为红色或黑色;
- 根节点是黑色;
- 所有叶子节点(即NULL)均为黑色;
- 从每个叶子到根的所有路径上不能有两个连续的红色节点(也就是每个红色节点的子节点只能是黑色。);
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
上边五条性质决定了红黑树是有平衡性的(因为从根节点到叶节点最长路径最多是最短路径的一倍,也就是最长路径上 红黑红黑红黑
这样,最短路径上 黑黑黑
这样),但是红黑树的平衡性没有 AVL 树那么严格(在 AVL 树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树),所以在插入删除过程中进行的左旋右旋操作会比AVL树少很多。
二、红黑树插入
首先红黑树是二叉搜索树,所以一个新的元素要插入的时候,先按照二叉搜索树的方式,比较跟每个节点的大小,决定向左还是向右走,走到一个待插入位置的节点,成为 N。
根据上边红黑树定义中的性质5,规定新增节点默认必须是红色,根据性质4,新增节点的父节点必须是黑色的;那么根据二叉搜索树找到插入点后,如果未能满足上述条件,就需要调整颜色并旋转树形,分为三种情况:
1、空树
也就是待插入节点就是根节点位置,那么让节点颜色为黑即可(根据红黑树定义中的性质2)
2、N 的父节点 P 是黑色
那么就是符合要求的,新增节点为红色,父节点为黑色,无需调整;
3、N 的父节点 P 是红色
根据性质3,N 的祖父节点必为黑色(因为插入前的红黑树是满足要求的)。
那么又分为三种情况:
- N 的叔父节点为红色
这种情况,将 N 的父节点和叔父节点的颜色都改为黑色,若祖父节点是根节点就将其改为黑色,否则将其颜色改为红色,并以祖父节点为插入的目标节点,开始递归检测,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/26d0d3e15665a8397a6af8a820a1a772.png)
- N 的叔父节点为黑色, 且 N 和 N 的父节点在同一边
也就是都是左子节点或者都是右子节点。以都是左子节点为例,将父节点改为黑色,祖父节点改为红色,然后以祖父节点为基准右旋(都为右子节点时做相应的左旋),如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/fc66a723bf2899e19f55833525736027.png)
- N 的叔父节点为黑色, 且 N 和 N 的父节点不在同一边
以父节点为祖父节点的左儿子为例,以父节点为基准,进行左旋,然后以父节点为目标插入节点进入上述3.2情况(N 的父节点 P 是红色,N 的叔父节点为黑色, 且 N 和 N 的父节点在同一边)进行操作,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/7f893ef12d71882582c5fb01ca9cb61c.png)
三、红黑树删除
待填写