一.什么是红黑树:
1.红黑树是二叉查找树的一种,将二叉树的节点给他标上red和black两种颜色。
2.二叉树有退化成链表的可能,红黑树是一种近似平衡的树。
例如下面这颗树:
二.红黑树性质
所谓的红黑树,只需要满足一些特有的性质,那我们就将他称为红黑树。网上很多五个性质。
1.这课树的节点只能是红色或者黑色两种颜色。
2.根节点必须是黑色
3.不可以有连在一起的红色节点
4.所有红色节点的子结点都是黑色,叶子结点(null结点)也是黑色的。
随便来个红黑树:
三.左旋和右旋
1.左旋:
以A作为根节点,旋转三部走。
第一步:动C结点,将C的父结点设为A
第二部:动B结点,将B的左孩子设为A,将B的父结点设为A的父结点。
第三部:动A结点,将A的右孩子设为C,将A的父结点设为B结点。
2.右旋:
以A作为根节点,旋转三部走。
第一步:动C结点,将C的父结点设为A
第二部:动B结点,将B的右孩子设为A,将B的父结点设为A的父结点。
第三部:动A结点,将A的左孩子设为C,将A的父结点设为B结点。
剩下的只是将中文翻译成代码:
旋转代码:
//左旋
//以形参node做为根旋转。
public void leftRotate(Node node){
if(node.parent == null){
Node A = node; //根节点
Node B = A.right; //根节点的右节点
//移动三部曲:动B的左节点
//第一步
B.left.parent = A;
//第二部:动B节点
B.left = A;
B.parent = null;
//三部曲:动A节点
A.parent = B;
A.right = B.left;
}
}
//右旋
//以形参node做为根旋转。
public void rightRotate(Node node){
if(node.parent == null){
Node A = node;
Node S = node.left;
//移动三部曲:动B的右节点
//一部曲
B.right.parent = A;
//二部曲:动B节点
B.right = A;
B.parent = null;
//三部曲:动A节点
A.parent = B;
A.left = B.right;
}
}
下次需要使用左旋或右旋只需调用方法即可。