///定义一个全局的空叶子节点 空的
//root节点
RbNode root;
RbNode nil = new RbNode();
public class RbNode {
//颜色
public int color;
//值
public int key;
//键的链接 需要连接父节点 还有左右节点
public RbNode left;
public RbNode right;
//父节点
public RbNode p;
}
//对x左旋 nil是空的node
/**
* y
* / \
* x γ
* / \
* α β
*
* 右旋 |↑ 左旋
* ↓|
*
* x
* / \
* α y
* / \
* β γ
* @param tree
* @param x 对x左旋 y的父节点是x
*
* y是父节点的右孩子 当前节点是y 然后节点上移到x然后对x操作左旋
*/
public void left_Rotate(RbNode tree, RbNode x){
RbNode y = x.right;
x.right = y.left;//x与y节点之间的键断开 1
if(y.left != nil){
y.left.p = x;//断开y与y左子树 链接x与y左子树(也就是把x的右子树连接y的左子树)2
}
y.p = x.p;//链接y到原本x的父节点上(因为1断开了)3
if(x.p == nil){//4-1
this.root = y;
}else if(x == x.p.left){4-2
x.p.left = y;
}else{
//3的后续 把父节点的right(也可能是根节点4-1或者左节点4-2)连接到y 4-3
x.p.right = y;
}
y.left = x;//链接y和x y成为x父节点 是左子树 5
x.p = y;
}
网友评论