红黑树是一种非严格均衡二叉树。是实现treeMap存储结构的基石
均衡二叉树是在二叉搜索树的基础上增加了自动维持平衡的特性。
二叉搜索树:又叫二叉查找树,二叉排序树
特性:1、节点的左子树和右子树都小于节点本身。2、节点的左右子树同样都为二叉搜索树
如下,典型的二叉搜索树(查找某个数使用二分查找)
下图也是二叉搜索树,但是很别扭假如要查找值位50,性能会很低。在这个基础上,引进均衡二叉树
经过自动平衡后,变成下图均衡二叉树。
红黑树就是非严格均衡二叉树,也具备自动维持均衡的特性,特点:
1、节点分为红色和黑色
2、根节点必为黑色
3、叶子节点都为null,且为黑色
4、新加到红黑树的节点是红色节点
5、不会出现两个相连的红色节点(红色节点下的两个子节点必为黑色节点)
6、从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点
红黑树最长路径不大于最短路径的2倍
红黑树最短路径:特点6可推出,从根节点到每个叶子节点的黑色节点数量是一样的,最短路径就是由纯黑色节点组成的路径。
红黑树最长路径:规则3和5可推出,一个红色节点必然连接黑色节点,当红色节点和黑色节点数量相同时,就是最长路径
为什么新加入到红黑树的节点是红色节点?
规则6可推出,当前红黑树从根节点到每个叶子节点的黑色节点数量相同的,若此时加入一个黑色节点,必然破坏规则。如果加入一个红色节点就不一定会破坏规则。除非加入红色节点的父节点是红色节点。加入红色节点破坏规则可能性更小。
红黑树结构被破坏,需要通过"变色"和"旋转"来维持均衡,"旋转"分为"左旋"和"右旋"
红黑树插入节点:
不需要调整即可平衡:当父节点为黑色节点时插入子节点
需要"变色"才能维持平衡:
1、当父节点和叔父节点都是红色节点时
2、插入的节点位根节点
需要"变色"和"旋转"才能平衡:(父节点位红色,叔父节点为黑色)
1、父节点是左节点,插入节点是左节点,此时需要右旋祖父节点,再通过变色才能维持平衡。新加入55
2、父节点是左节点,插入节点是右节点,需要先左旋父节点,再右旋祖父节点,最后变色维持平衡。新加入67
3、父节点是右节点,插入节点是右节点。左旋祖父节点,变色
4、父节点是右节点,插入节点是左节点。右旋父节点,再左旋祖父节点,变色。
红黑树节点删除:(如果违反规则,通过"变色"或者"旋转"调整)
1、待删除节点其左右节点都是null:直接删除该节点,复制null
2、待删除节点左右节点有一个是null:删除该节点后将有值的那个节点取代当前删除的节点。
3、子节点都是非null:
一、找到该节点的前驱或者后继,
前驱:左子树中最大的节点。(该节点.prev)
后继:右子树中最小的节点。(该节点.next)
(前驱或者后继最多只有一个非null子节点???why?)
二、删除该节点后,将前驱或者后继复制到该节点,然后删除前驱或者后继。(以前驱为例)
前驱是黑色节点:有一个非null子节点
前驱为黑色节点,子节点都是null
前驱为红色节点,子节点都为null
红黑树节点删除总结:
1、删除的为根节点,删除时将该节点置为null
2、待删除节点左右节点都是null,删除时将该节点置为null
3、待删除节点左右节点有一个非null,删除时用有值的节点取代删除节点。
4、待删除节点左右都是非null,找到前驱或者后继,删除时用前驱或者后继取代删除节点。
删除后引起红黑树(均衡二叉树)不平衡,通过"变色""旋转"使其平衡。
https://blog.csdn.net/fengdongsuixin/article/details/96351133