(注:以下图片全部源于《算法 第4版》)
左倾红黑树的原理及简单实现
左倾红黑树的简介
左倾红黑树(LLRB)是一种类型的自平衡二叉查找树。它是红黑树的变体,并保证对操作相同渐近的复杂性,但被设计成更容易实现。
由于每一棵红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。
左倾红黑树的定义
- 红链接均为左连接
- 没有任何一个结点同时和两条红链接相连
- 该树的任意空链接到根结点的路径上的黑链接数量相同。
左倾红黑树与2-3树的对比
红黑树可以看作成是2-3树的一种表现形式,红链接连接的结点可以看作为是一个3-结点。
左倾红黑树的颜色表示
public class MyRedBlackBST<Key extends Comparable<Key>, Value> {
private static class Node<Key, Value> {
private Key key;
private Value val;
private Node<Key, Value> left;
private Node<Key, Value> right;
private int colour;
public Node(Key key, Value val, int colour) {
this.key = key;
this.val = val;
this.colour = colour;
}
}
}
左倾红黑树的一些基本操作
1、颜色判断
private static final int RED = 0;
private static final int BLACK = 1;
private boolean isRed(Node x) {
if (x == null) {
return false;
}
return x.colour == RED;
}
2、旋转
左旋转
private Node<Key, Value> rotateLeft(Node<Key, Value> x) {
Node<Key, Value> y = x.right;
x.right = y.left;
y.left = x;
y.colour = x.colour;
x.colour = RED;
return y;
}
右旋转