红黑树 01 红黑树和2-3树的等价性

2-3树

  • 2-3树是一种绝对平衡的二分搜索树;
  • 2-3树中存在2种节点:2节点和3节点;
  • 2节点:每个节点存1个元素,有2个孩子;
  • 3节点:每个节点存2个元素,有3个孩子;
  • 新添加的元素都要融合进叶子节点,或者融合成3节点,或者融合成临时的4节点;
  • 融合成临时的4节点后,就要将4节点拆成3个2节点,然后将中间的节点向上融合到其父节点,融合后的结构如果任然是4节点,则继续拆;

红黑树

  • 红黑树和2-3树是等价的;
  • 红黑树中的每个节点只存一个元素,因而实现上更简单;
  • 红黑树中的节点要么是红色,要么是黑色;
  • 红黑树中红节点表示其和其父节点一起表示2-3树中的一个3节点;
  • 红黑树中红节点都是向左倾斜的,定义出来的;
  • 红黑树中的节点有一个表示其颜色的属性;
  • 红黑树中的红节点对应2-3树中3节点中存储的左边的元素;
  • 红黑树中根节点是黑色的;
  • 红黑树中从任意节点到叶子节点(最后的空节点),经过的黑色节点是一样的; *
  • 红黑树中一个节点是红色的,那么他的孩子节点都是黑色的;
  • 红黑树中一个节点是黑色的,那么他的右孩子是黑色的;
  • 红黑树中每个叶子节点(最后的空节点)是黑色的;
  • 红黑树是保持“黑平衡”的二叉树,严格意义上,不是平衡二叉树;

红黑树时间复杂度分析

  • 红黑树的最大高度:2logn;
  • 红黑树的时间复杂度为O(logn);
  • 红黑树添加删除更快,AVL树查询更快;
  • 树结构不怎么变用AVL树,经常添加删除操作用红黑树;

红黑树基础代码

  • 红黑树中每个节点在初始化的时候都是红节点;
  • 每个空节点(null)是黑节点;
public class RBTree, V> {

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

    private class Node{
        public K key;
        public V value;
        public Node left, right;
        public boolean color;

        public Node(K key, V value){
            this.key = key;
            this.value = value;
            left = null;
            right = null;
            color = RED;
        }
    }

    private Node root;
    private int size;

    public RBTree(){
        root = null;
        size = 0;
    }

    public int getSize(){
        return size;
    }

    public boolean isEmpty(){
        return size == 0;
    }

    // 判断节点node的颜色
    private boolean isRed(Node node){
        if(node == null)
            return BLACK;
        return node.color;
    }

}

你可能感兴趣的:(红黑树 01 红黑树和2-3树的等价性)