通俗易懂的红黑树简析

一、基本概念

 红黑树本质上是一棵近似平衡的二叉树,它的节点只有两种颜色即红与黑,它满足二叉搜索树的基本性质,即树上的任何节点的值大于其左子节点(若左子节点存在),任何节点的值大于其右子节点的值(若右子节点存在)。

 近似平衡:深度最大的节点的深度<= 2 * 深度最小的节点的深度。具体如何保证这种近似平衡后面会说到。

 红黑树与平衡二叉树比较: 因为红黑树只追求近似平衡,所以在插入与删除节点时,翻转次数远远少于平衡树,因此在需要较多插入删除操作的场景中,使用红黑树更好。 同样也因为近似平衡,所以在查询时,红黑树查询的深度可能会大于平衡二叉树,所以在需要较多查询的场景中,使用平衡二叉树更好。
通俗易懂的红黑树简析_第1张图片
(图片来自网络)

二、红黑树的必须满足的五条性质

性质1 . 节点是红色或黑色。
性质2 . 根节点是黑色。
性质3 . 每个叶节点(NIL节点,空节点)是黑色的。
性质4 . 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5 . 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
       因为性质5,所以延伸除了近似平衡状态,试想根节点到每个叶子节点的黑色节点个数相同,而每两个红色节点之间不能直接相连,根节点又必须为黑色,所以推导出:黑色节点个数<=每条路径的总节点个数<=2倍的黑色节点数,所以最大深度与最小深度的最多相差一倍。
 因为性质5,默认新插入的节点都为红色,就算有颜色冲突,也可以通过变色和旋转来修改树。
 注意:红黑树的查找、删除、添加操作都为log(n)。


三、红黑树的操作

 1、查找操作,是一个递归过程,很简单,与当前节点比较,若大于该节点则查找右子树,若小于该节点则查找该节点的左子树。log(n)复杂度。

 2、新增操作,首先通过查找操作找到合适的插入位置,不能破坏平衡性质(左子节点<父节点<右子节点)。 插入后,进行变色、旋转操作保证这个树的五个性质。
 
 3、删除操作,先查找到该节点的位置,将该节点置为空,之后通过变色、旋转等操作保证树的这五个性质。

 具体变色、旋转的流程,我会在之后补上。
 









你可能感兴趣的:(数据结构)