Java核心 — 红黑树

353 阅读2分钟

JYM大家好,这里是布洛妮娅, 鸭鸭的更文频道😎,本篇文章是对红黑树的一个学习记录和总结!!

一、红黑树的性质

红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树的每个节点都遵循下面的规则:

  • 性质1:每个节点要么是黑色,要么是红色.
  • 性质2:根节点是黑色.
  • 性质3:每个叶子节点(NIL)是黑色.
  • 性质4:每个红色结点的两个子结点一定都是黑色.
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点.

二、红黑树能自平衡,它靠的是什么?

三种操作:左旋、右旋和变色

  • 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变.
  • 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变.
  • 娈色:结点的颜色由红变黑或由黑变红.

三、红黑树的插入场景

  1. 红黑树为空
  • 把插入的节点设置为根节点,并设置为黑色
  1. 插入节点的父节点是黑节点
  • 直接插入
  1. 插入节点的父节点是红节点
  • 叔叔节点存在且为红节点

    • 把父节点和叔叔节点设置为黑色
    • 把祖父节点设置为红色
    • 将祖父节点当作新插入的节点再次按规则变色
  • 叔叔节点不存在或为黑色

    • 父节点是祖父节点的左子节点
      • 插入节点是父节点的左节点

        1.将父节点设置为黑色
        2.祖父节点设置为红色
        3.将祖父节点右旋
        
      • 插入节点是父节点的右节点

         1.对父节点左旋
         2.将父节点作为插入节点,得到上面的情形
         3.再来一次右旋
        
    • 父节点是祖父节点的右子节点
      • 插入节点是父节点的右节点

        1.将父节点设置为黑色
        2.祖父节点设置为红色
        3.将祖父节点左旋
        
      • 插入节点是父节点的左节点

         1.对父节点右旋
         2.将父节点作为插入节点,得到上面的情形
         3.再来一次左旋
         
        

红黑树演示地址