今天先来用java实现红黑色左旋和右旋。后边再把添加、删除给补充上。
什么是红黑树?
红黑树是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的一陪。具体来说,红黑树是满足如下条件的二叉查找树(binary search tree):
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色
- 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)。
- 对于每个节点,从该点至
null
(树尾端)的任何路径,都含有相同个数的黑色节点。
在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件3或条件4,需要通过调整使得查找树重新满足红黑树的条件。
首先我们定义一个树的节点
public class BTreeNode<T> {
private boolean color;
T key;
BTreeNode<T> rightNode;
BTreeNode<T> leftNode;
BTreeNode<T> parent;
public boolean isColor() {
return color;
}
public void setColor(boolean color) {
this.color = color;
}
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
public BTreeNode<T> getRightNode() {
return rightNode;
}
public void setRightNode(BTreeNode<T> rightNode) {
this.rightNode = rightNode;
}
public BTreeNode<T> getLeftNode() {
return leftNode;
}
public void setLeftNode(BTreeNode<T> leftNode) {
this.leftNode = leftNode;
}
public BTreeNode<T> getParent() {
return parent;
}
public void setParent(BTreeNode<T> parent) {
this.parent = parent;
}
}
左旋和右旋代码:
package com.RBtree;
/**
* @author zs
* @Title: ${file_name}
* @Package ${package_name}
* @Description: ${todo}
* @date 2018-10-2017:50
*/
public class BTTreeImpl<T> {
private BTreeNode<T> mRoot;
private static final boolean RED = false;
private static final boolean BLACK = true;
//左旋
private void leftRate(BTreeNode<T> x){
BTreeNode<T> y=x.rightNode;//获取当前根节点的右节点
x.rightNode=y.leftNode; //把当前根节点的右节点设置为右节点的左节点
if(y.rightNode!=null) //这时候右节点已经与当前根节点断开,所以
y.rightNode.parent=x; //我们判断右节点是否为空,若不为空把他的父节点指向根节点
if(x.parent==null){
this.mRoot=y; //若当前根节点为树的根节点,那么就设置当前树的根节点为y节点。
}else {
if(x==x.parent.leftNode){ //当前根节点的父节点不为空,先判断当前节点是为
x.parent.leftNode=y; //父节点的左节点还是右节点,然后对应赋值。
}else {
x.parent.rightNode=y;
}
}
y.leftNode=x; //右子节点成为根节点后设置左节点为x
x.parent=y; //x的父节点指向y
}
//右旋
private void rightRate(BTreeNode<T> x){
BTreeNode<T> y=x.leftNode;
x.leftNode=y.rightNode;
if(y.rightNode!=null){
y.rightNode.parent=x;
}
if(x.parent==null){
this.mRoot=y;
}else {
if(x==x.parent.leftNode){
x.parent.leftNode=y;
}else {
x.parent.rightNode=y;
}
}
y.rightNode=x;
x.parent=y;
}
}