红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能在~lgN次比较内结束,但是这样在动态插入中保持树的完美平衡代价太高,所以,我们稍微放松逛一下限制,希望找到一个能在对数时间内完成查找的数据结构。这个时候,红黑树站了出来。 

红黑树的性质:

  1、节点是红色或者黑色。

  2、根节点是黑色

  3、每个叶子节点都是黑色的空节点(NULL为黑色)

  4、每个红色节点的子叶子节点是黑色

  5、从任意节点到其每个叶子节点的所有路径都包含相同的黑色节点。这一点说一下我自己的理解,由于比如a节点到任意叶子节点黑色节点相同,其实从根节点到任意节点的黑色节点相同一个道理,因为根节点到a节点其实是共有的(对于a节点到任意叶子节点的path)。所以我的理解是:根节点到每个叶子节点的所有路径都包括相同黑色节点。

 

  红黑树的插入

  首先红黑树的插入其实不是那么容易实现的,以前搜索树的插入我们很容易理解现在我们首先思考一个问题,你插入节点的默认颜色是RED或BLACK? 这里我们需要根据性质来思考,首先如果插入黑节点,这个可以直接插入无论它的父亲是什么颜色,但是红黑树的性质是每条路径的黑色节点数目相同这个时候你再想想那其他路径的黑色节点数目一定比你现在少一个节点,所以调整起来是非常繁琐的. 插入红节点不需要调整其他路径,如果它的父亲为黑,那么直接插入,如果他的父亲为红那么在该路径上面开始分情况调整. 所以插入节点默认颜色一定要为红.如果为黑调节成本太大了。

  红黑树底层原理及实现https://blog.csdn.net/qq_39344902/article/details/81605850