1.R-B Tree简介
红黑树又称“R-B Tree”,他是一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特点:
1.每个节点或者是黑色,或者是红色。
2.跟节点是黑色。
3.每个叶子节点(NIL)是黑色。[这里的叶子节点是指为空(NIL或者NULL)的叶子节点]
4.如果一个节点是红色的,则它的子节点必须是黑色的。
5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(确保没有一条路径会比其他路径长出两倍。因而,红黑树是相对接近平衡的二叉树)
红黑树的时间复杂度为:O(lgn)
红黑树的基本操作(一) 左旋和右旋
红黑树的基本操作是添加和删除。在对红黑树进行添加或删除之后,都会用到旋转方法。为什么呢?道理很简单,添加或删除红黑树中的节点之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一棵红黑树了,而是一棵普通的树。通过旋转,可以使这棵树重新成为红黑树。简单点说,旋转的目的就是让树保持红黑树的特性。
旋转包括两种:左旋和右旋。下面分别对它们进行介绍。
1. 基本定义
public class RBTree<T extends Comparable<T>>{
private RBTNode<T> mRoot;
private static final boolean RED = false;
private static final boolean BLACK = true;
public class RBTNode<T extends Comparable<T>>{
boolean color;
T key;
RBTNode<T> left;
RBTNode<T> right;
RBTNode<T> parent;
public RBTNode(T key, boolean color, RBTNode<T> parent, RBTNode<T> left, RBTNode<T> right) {
this.key = key;
this.color = color;
this.parent = parent;
this.left = left;
this.right = right;
}
}
......
}
2.左旋
对x进行左旋,意味着“将x变成一个做节点”。
左旋的实现代码(java)