• java实现红黑树


    参考:

    https://zhuanlan.zhihu.com/p/143396578

    https://zhuanlan.zhihu.com/p/139907457

    https://www.jianshu.com/p/e136ec79235c

     红黑树的五条性质:
    1. 结点是红色或黑色。
    2. 根结点是黑色。
    3. 所有叶子都是黑色。(叶子是NIL结点)
    4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
    5. 从任一节结点其每个叶子的所有路径都包含相同数目的黑色结点。

    我一开始总不明白红黑树搞颜色是为什么,明明不用颜色存数据,岂不是浪费空间,后来才明白红色和黑色其实起的左右类似于AVL树中的高度差。
    红黑树的性质45保证了红黑树两个子树中,一颗的高度最多也就是另外一颗的两倍。
    虽然不是完美的平衡,但即便保证了查询效率。
    在每次新插入节点或删除旧的节点之后,就可能破坏红黑树的性质,所以这个时候就需要修剪。修剪的基本操作有两种:旋转和涂色

    一、插入修剪

    插入修剪:唯一需要处理的情况是父节点是红色!!!
    新插入节点总是红色,因为如果是黑色,马上就破坏了平衡
    1/2不会破坏平衡,所以只有3/4/5需要处理
    红黑树有五个性质,插入恰好也是五种情况:
    1.新节点就是树根,没有父节点,直接涂黑就可以了
    2.新节点的父节点是黑色,那么插入也不会破坏平衡,OK
    3.新节点的父节点是红色,叔叔节点也是红色,(祖父肯定是黑色),解决:把父节点和叔叔变黑色,祖父变红色
    4.新节点的父节点是红色,叔叔节点是黑色或没有叔叔,父结点是祖父的左孩子,且新结点是父结点的右孩子,解决:对父节点左旋,进入步骤5
    5.新结点的父结点是红色,叔叔结点是黑色或没有叔叔,父结点是祖父的左孩子,且新结点是父结点的左孩子,解决:对祖父右旋,之后父节点涂黑,老祖父涂红
    4.5.还有对称操作,需要考虑!
    6.新节点的父节点是红色,叔叔节点是黑色或没有叔叔,父节点是祖父的右孩子,且新节点是父节点的左孩子,解决:对父节点右旋,进入步骤7
    7.新节点的父节点是红色,叔叔节点是黑色或没有叔叔,父节点是祖父的右孩子,且新节点是父节点的右孩子,解决:对祖父左旋,之后父节点涂黑,老祖父涂红

    二、删除修剪


    删除修理
    唯一需要处理的就是本身是黑色的节点被删除
    一级分类:
    1.没有子节点,自己是红色,直接删!
    2.没有子节点,自己是黑色?
    3.自己是红色,只有一个子节点,子节点是黑色,子节点直接替代自己即可,变成子节点的颜色
    4.自己是黑色,只有一个子节点,子节点也是黑色?红黑树不存在这种情况,不需要处理!
    5.自己是黑色,只有一个子节点,子节点是红色,子节点替代自己,然后变成黑色,删除子节点。
    6.自己是红色或黑色,有两个子节点,找到左子树的最大节点leftMax替换自己,删除leftMax可以转化成步骤1、2、3、5中的一个
    总结:1~6已经囊括了一个节点的所有子节点(0,1,2)情况,最终只有2没有解决!
    二级分类:
    1.当前节点没有父亲,是根节点,此时虽然删了一个黑节点,但所有路径的黑节点都少了,平衡并未打破。
    2.父亲、兄弟、侄子结点都是黑色,删除当前节点,把兄弟变成红色,(父亲一下平衡了,但少了一个黑色节点,需要递归处理上层的不平衡)
    3.父亲黑色,兄弟红色,父节点左旋或右旋,原父节点变红,原兄弟变黑——转(4)
    4.父结点红色,兄弟和侄子结点是黑色,父结点变成黑色,兄弟结点变成红色
    5.父结点随意,兄弟结点是父亲的黑色右孩子,左侄子结点是红色,兄弟结点为轴进行右旋,原兄弟结点变为红色,新兄弟变为黑色,转(6)
    6.父结点随意,兄弟结点是父亲的黑色右孩子,右侄子结点是红色。父结点为轴左旋,新老父节点颜色互换,右侄子变黑
    5.6.还有镜像操作需要考虑!
    7.父节点随意,兄弟节点是父亲的黑色左孩子,左侄子是红色,父节点右旋,新老父节点颜色交换,左侄子变黑。
    8.父节点随意,兄弟节点是父亲的黑色左孩子,右侄子是红色,兄弟节点左旋,原兄弟变红,新兄弟变黑,转7
    总结1~8已经囊括了当前节点为黑情况下父兄侄所有的颜色情况

  • 相关阅读:
    hdu 1978
    hdu 2700
    hdu 1176
    hdu 2390
    hdu 2707
    hdu 1804
    hdu 2703
    hdu 2572
    hdu 1171
    React有状态组件和无状态组件
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15393168.html
Copyright © 2020-2023  润新知