红黑树
【事先声明:N(now)表示当前节点,P(parent)表示N的父节点,U(uncle)表示N的叔叔节点,G(grandfather)表示N的祖父节点,也就是P和U的父节点。】
1.插入节点的父节点和其叔叔节点(祖父节点的另一个子节点)均为红色。
应对策略:将当前节点的父亲节点P和叔叔节点M涂黑,祖父节点G涂红,再将祖父节点G设置为当前节点。
2.叔叔节点不存在或为黑节点,插入节点的父亲节点是祖父节点的左节点
3.叔叔节点不存在或为黑节点,插入节点的父亲节点是祖父节点的右节点
private void insertFixUp(RBNode<T> node){
RBNode<T> parent,gparent;//定义父节点和祖父节点
while(((parent = parentOf(node)) != null) && isRed(parent)){
gparent = parentOf(parent);//获得祖父节点
RBNode<T> uncle = gparent.right;//获得叔叔节点
if(uncle != null && isRed(uncle)){
setBlack(parent);//把父节点和叔叔节点涂黑
RBNode<T> tmp = parent;//然后将父节点和自己调换一下,为下面右旋做准备
}else{//若父节点是祖父节点的右子节点,与上面的情况完全相反,本质是一样的
RBNode<T> uncle = gparent.left;
if(uncle != null && isRed(uncle)){
1.在查询性能方面红黑树略微逊色于AVL树,因为红黑树不是严格的平衡树
2.在增删方面,avl每次增删都需要进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于avl树为了维持平衡的开销要小得多
整体来说:红黑树是牺牲了严格的高度平衡的优越条件为 代价红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。

浙公网安备 33010602011771号