Java 数据结构 & 算法宁可累死自己, 也要卷死别人 12 红黑树

Posted 我是小白呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 数据结构 & 算法宁可累死自己, 也要卷死别人 12 红黑树相关的知识,希望对你有一定的参考价值。

【Java 数据结构 & 算法】⚠️宁可累死自己, 也要卷死别人 12⚠️ 红黑树

概述

从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.

红黑树

红黑树 (Red Black Tree) 是一种自平衡二叉查找树. 如图:


红黑树的特征:

  1. 研究红黑树的每个节点都是由颜色的, 非黑即红
  2. 根节点为黑色
  3. 每个叶子节点都是黑色的
  4. 如果一个子节点是红色的, 那么它的孩子节点都是黑色的
  5. 从任何一个节点到叶子节点, 经过的黑色节点是一样的

红黑树的实现

Node 类

// Node类
private class Node 
    public E e;
    public Node left;
    public Node right;
    public boolean color;
    
    // Node构造
    public Node(E e) 
        this.e = e;
        this.left = null;
        this.right = null;
        color = RED;
    

    @Override
    public String toString() 
        return "It is node value is: " + e;
    

添加元素

// 添加元素
public Node addElement(Node node, E e) 

    if(node == null) 
        size++;
        return new Node(e);
    


    // 判断元素大小
    if(e.compareTo(node.e) < 0) 

        // 左添加
        node.left = addElement(node.left, e);
     else 

        // 右添加
        node.right = addElement(node.right, e);
    

    // 左旋
    if(isRed(node.right) && !isRed(node.left)) 
        node = leftRotate(node);
    

    // 右旋
    if(isRed(node.left) && !isRed(node.left.left)) 
        node = rightRotate(node);
   

    // 颜色反转
    if(isRed(node.right) && !isRed(node.left)) 
        flipColors(node);
    

    return node;

左旋

左旋指的是, 以某个节点作为支撑点, 其右子节点变为旋转节点的父节点, 右子节点的左子节点的左字节点变为旋转节点的右子节点, 旋转节点的左子节点保持不变. 如图:

//    node               x
//   /    \\    左旋转   /  \\
//  T1     x    ==>  node T3
//        /  \\       / \\
//       T2  T3     T1 T2
private Node leftRotate(Node node) 
    Node x = node.right;

    // 左旋转
    node.right = x.left;
    x.left = node;

    x.color = node.color;
    node.color = RED;

    return x;

右旋

右旋与左旋相反.

代码实现:

//        node               x
//       /    \\    右旋转   /  \\
//      x     T2    ==>   y   node
//    /  \\                   /  \\
//   y   T1                 T1  T2
private Node rightRotate(Node node) 
   Node x = node.left;

    // 右旋转
    node.left = x.right;
    x.right = node;

    x.color = node.color;
    node.color = RED;

    return x;

完整代码

public class RBT<E extends Comparable<E>> 

    private static final boolean RED = true;
    private static final boolean BLACK = true;


    // Node类
    private class Node 
        public E e;
        public Node left;
        public Node right;
        public boolean color;

        // Node构造
        public Node(E e) 
            this.e = e;
            this.left = null;
            this.right = null;
            color = RED;
        

        @Override
        public String toString() 
            return "It is node value is: " + e;
        
    

    public Node root;
    private int size;
    public int size() 
        return size;
    

    // 添加元素
    public Node addElement(Node node, E e) 

        if(node == null) 
            size++;
            return new Node(e);
        


        // 判断元素大小
        if(e.compareTo(node.e) < 0) 

            // 左添加
            node.left = addElement(node.left, e);
         else 

            // 右添加
            node.right = addElement(node.right, e);
        

        // 左旋
        if(isRed(node.right) && !isRed(node.left)) 
            node = leftRotate(node);
        

        // 右旋
        if(isRed(node.left) && !isRed(node.left.left)) 
            node = rightRotate(node);
        

        // 颜色反转
        if(isRed(node.right) && !isRed(node.left)) 
            flipColors(node);
        

        return node;
    


    //    node               x
    //   /    \\    左旋转   /  \\
    //  T1     x    ==>  node T3
    //        /  \\       / \\
    //       T2  T3     T1 T2
    private Node leftRotate(Node node) 
        Node x = node.right;

        // 左旋转
        node.right = x.left;
        x.left = node;

        x.color = node.color;
        node.color = RED;

        return x;
    

    //        node               x
    //       /    \\    右旋转   /  \\
    //      x     T2    ==>   y   node
    //    /  \\                   /  \\
    //   y   T1                 T1  T2
    private Node rightRotate(Node node) 
        Node x = node.left;

        // 右旋转
        node.left = x.right;
        x.right = node;

        x.color = node.color;
        node.color = RED;

        return x;
    

    // 颜色反转
    private void flipColors(Node node) 
        node.color = RED;
        node.left.color = BLACK;
        node.right.color = BLACK;
    

    // 判断是否为红色
    private boolean isRed(Node node) 
        if(node==null) return BLACK;
        return node.color;
    

以上是关于Java 数据结构 & 算法宁可累死自己, 也要卷死别人 12 红黑树的主要内容,如果未能解决你的问题,请参考以下文章

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 20 排序算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 18 贪心算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 18 贪心算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 17 KMP 算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 17 KMP 算法

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 10 哈希实现