package com.mesnac.tree;
public class RBTree {
// 根节点
public RBNode root;
// 空节点
// public RBNode nil = new RBNode(null,null,null,false);
/**
* 插入节点
*
* @param node
*/
public void insert(RBNode node) {
// 判断树是否为空
if (root == null) {
root = node;
root.isRed = false;
root.left = new RBNode(null, null, null, false);
root.right = new RBNode(null, null, null, false);
root.left.parent = root;
root.right.parent = root;
return;
}
RBNode now = root;
// 寻找要插入的位置
while (now.val != null) {
if (now.val > node.val)
now = now.left;
else if (now.val < node.val)
now = now.right;
else
return;
}
// 这样我们找到了相应的最后的点,将这个点替换成我们的点
now.val = node.val;
now.isRed = true;
now.left = new RBNode(null, null, null, false);
now.right = new RBNode(null, null, null, false);
now.left.parent = now;
now.right.parent = now;
// 然后进行树的修正
insertFix(now);
}
public void insertFix(RBNode now) {
// 如果是根节点,上面应经修正过了,不处理
System.out.println("现在处理" + now.val);
if (now == root) {
if (now.isRed) {
now.isRed = false;
}
return;
}
// 如果插入节点的父节点是黑,不处理
if (!now.parent.isRed) {
return;
}
// 插入的节点父节点红
if (now.parent.isRed) {
// 判断父节点是左还是右
// 父节点是祖父左子
if (now.parent.parent.left.val == now.parent.val) {
// 叔叔是红色
if (now.parent.parent.right.isRed) {
now.parent.isRed = false;
now.parent.parent.right.isRed = false;
now.parent.parent.isRed = true;
// 当前节点变成父节点
insertFix(now.parent.parent);
}
// 叔叔黑色
else {
// 当前节点是右子
if (now.parent.right.val == now.val) {
now = now.parent;
// 左旋
LRC(now);
insertFix(now);
}// 当前节点左子
else {
now.parent.isRed = false;
now.parent.parent.isRed = true;
// 祖父右旋
//System.out.println("右旋开始了" + now.parent.parent.val);
LLC(now.parent.parent);
}
}
}
// 父节点是祖父右子
else {
// 叔叔是红色
if (now.parent.parent.left.isRed) {
now.parent.isRed = false;
now.parent.parent.isRed = true;
now.parent.parent.left.isRed = false;
System.out.println("变色");
insertFix(now.parent.parent);
}
// 叔叔黑色
else {
// 当前节点是左子
if (now.parent.left.val == now.val) {
now = now.parent;
// 左旋
System.out.println("左旋开始" + now.val);
RLC(now);
insertFix(now);
}// 当前节点左子
else {
now.parent.isRed = false;
now.parent.parent.isRed = true;
// 祖父右旋
//System.out.println("右旋开始" + now.val);
RRC(now.parent.parent);
}
}
}
}
}
// (父节点是祖父节点的左节点,当前节点是父节点右子),传入父节点
public void LRC(RBNode node) {
if(node.val == 15){
System.out.println("LRC"+node.val);
}
RBNode gfather = node.parent;
gfather.left = node.right;
node.right = node.right.left;
gfather.left.left = node;
gfather.left.parent = gfather;
node.parent = gfather.left;
node.right.parent = node;
}
// (父节点是祖父节点的右孩子,当前节点是左子),传入父节点
public void RLC(RBNode node) {
System.out.println("RLC"+node.val);
RBNode gfather = node.parent;
System.out.println("RLC"+gfather.val);
gfather.right = node.left;
node.left = node.left.right;
gfather.right.right = node;
gfather.right.parent = gfather;
node.parent = gfather.right;
node.left.parent = node;
System.out.println("RLCgather"+gfather.val);
System.out.println("RLC"+node.parent.val);
}
// (父节点是祖父节点的左孩子,当前节点是左子)(变色),传入祖父
public void LLC(RBNode node) {
// 左还是右
// 左
System.out.println("祖父节点"+node.val);
if (node == root) {
this.root = node.left;
node.left = node.left.right;
root.right = node;
root.left.parent = root;
root.right.parent = root;
node.left.parent = node;
return;
}
RBNode gfather = node.parent;
System.out.println("gf"+gfather.val);
RBNode father = node.left;
if(gfather.left.val == node.val)
gfather.left = node.left;
else
gfather.right = node.left;
node.left = node.left.right;
father.right = node;
father.parent = gfather;
node.parent = father;
node.left.parent = node;
}
//父节点是祖父的右孩子,当前节点是右子(变色),传入祖父
public void RRC(RBNode node){
if(node == root){
this.root = node.right;
node.right = node.right.left;
root.left = node;
root.left.parent = node;
root.right.parent =node;
node.right.parent = node;
return;
}
System.out.println("RRC"+node.val);
RBNode gfather = node.parent;
RBNode father = node.right;
if(gfather.left.val == node.val)
gfather.left = node.right;
else
gfather.right = node.right;
node.right = node.right.left;
father.left = node;
father.parent = gfather;
node.parent = father;
node.right.parent = node;
}
public void remove(RBNode node) {
}
// 先序遍历
public void MLR(RBNode now) {
System.out.println(now.val);
if (now.left.val != null)
MLR(now.left);
if (now.right.val != null)
MLR(now.right);
}
// 中序遍历
public void LMR(RBNode now) {
if (now.left.val != null)
LMR(now.left);
System.out.println(now.val);
if (now.right.val != null)
LMR(now.right);
}
// 后序遍历
public void LRM(RBNode now) {
if (now.left != null)
LRM(now.left);
if (now.right != null)
LRM(now.right);
if (now.val != null)
System.out.println(now.val);
}
public static void main(String args[]) {
RBTree a = new RBTree();
RBNode node = new RBNode(null, null, 12, true);
a.insert(node);
node = new RBNode(null, null, 1, true);
a.insert(node);
node = new RBNode(null, null, 9, true);
a.insert(node);
node = new RBNode(null, null, 2, true);
a.insert(node);
node = new RBNode(null, null, 0, true);
a.insert(node);
node = new RBNode(null, null, 11, true);
a.insert(node);
node = new RBNode(null, null, 7, true);
a.insert(node);
node = new RBNode(null, null, 19, true);
a.insert(node);
node = new RBNode(null, null, 4, true);
a.insert(node);
node = new RBNode(null, null, 15, true);
a.insert(node);
//
node = new RBNode(null, null, 18, true);
a.insert(node);
//System.out.println("=="+a.root.right.right.right.val);
node = new RBNode(null, null, 5, true);
a.insert(node);
node = new RBNode(null, null, 14, true);
a.insert(node);
node = new RBNode(null, null, 13, true);
a.insert(node);
node = new RBNode(null, null, 10, true);
a.insert(node);
System.out.println("========begin");
node = new RBNode(null, null, 16, true);
a.insert(node);
node = new RBNode(null, null, 6, true);
a.insert(node);
node = new RBNode(null, null, 3, true);
a.insert(node);
node = new RBNode(null, null, 8, true);
a.insert(node);
node = new RBNode(null, null, 17, true);
a.insert(node);
a.LMR(a.root);
}
}
package com.mesnac.tree;
/**
* 红黑树节点
* @author 1
*
*/
public class RBNode {
public RBNode left;
public RBNode right;
public RBNode parent;
public Integer val;
public boolean isRed;
public RBNode(){
}
public RBNode(RBNode left,RBNode right,Integer val,boolean isRed){
this.left = left;
this.right = right;
this.val = val;
this.isRed = isRed;
}
}