您的位置:首页 > 编程语言 > Java开发

红黑的插入java版本

2015-10-03 20:04 585 查看
public class RBTree {

private final Node NIL = new Node(null,null,null,Color.BLACK,-1);

private Node root;

public RBTree() {

root = NIL;

}

public RBTree(Node root) {

this.root = root;

}

public void insert(int data){

rbInsert(new Node(data));

}

//插入节点

private void rbInsert(Node node) {

Node previous = NIL;

Node temp = root;

while (temp != NIL) {

previous = temp;

if (temp.getValue() < node.getValue()) {

temp = temp.getRight();

} else {

temp = temp.getLeft();

}

}

node.setParent(previous);

if (previous == NIL) {

root = node;

root.setParent(NIL);

} else if (previous.getValue() > node.getValue()) {

previous.setLeft(node);

} else {

previous.setRight(node);

}

node.setLeft(NIL);

node.setRight(NIL);

node.setColor(Color.RED);

rb_Insert_Fixup(node);

}

//插入节点后的调整

private void rb_Insert_Fixup(Node node) {

while (node.getParent().getColor() == Color.RED) {

if (node.getParent() == node.getParent().getParent().getLeft()) {

Node rightNuncle = node.getParent().getParent().getRight();

if (rightNuncle.getColor() == Color.RED) {

rightNuncle.setColor(Color.BLACK);

node.getParent().setColor(Color.BLACK);

node.getParent().getParent().setColor(Color.RED);

node = node.getParent().getParent();

} else if(rightNuncle.getColor() == Color.BLACK){

if(node == node.getParent().getRight()) {

node = node.getParent();

leftRotate(node);

}

node.getParent().setColor(Color.BLACK);

node.getParent().getParent().setColor(Color.RED);

rightRotate(node.getParent().getParent());

}

} else {

Node leftNuncle = node.getParent().getParent().getLeft();

if (leftNuncle.getColor() == Color.RED) {

leftNuncle.setColor(Color.BLACK);

node.getParent().setColor(Color.BLACK);

node.getParent().getParent().setColor(Color.RED);

node = node.getParent().getParent();

} else if(leftNuncle.getColor() == Color.BLACK){

if(node == node.getParent().getLeft()) {

node = node.getParent();

rightRotate(node);

}

node.getParent().setColor(Color.BLACK);

node.getParent().getParent().setColor(Color.RED);

leftRotate(node.getParent().getParent());

}

}

}

root.setColor(Color.BLACK);

}

//左转函数

private void leftRotate(Node node) {

Node rightNode = node.getRight();

node.setRight(rightNode.getLeft());

if (rightNode.getLeft() != NIL) {

rightNode.getLeft().setParent(node);

}

rightNode.setParent(node.getParent());

if (node.getParent() == NIL) {

root=rightNode;

} else if (node == node.getParent().getLeft()) {

node.getParent().setLeft(rightNode);

} else {

node.getParent().setRight(rightNode);

}

rightNode.setLeft(node);

rightNode.getLeft().setParent(rightNode);

}

//右转函数

private void rightRotate(Node node) {

Node leftNode = node.getLeft();

node.setLeft(leftNode.getRight());

if (leftNode.getRight() != NIL) {

leftNode.getRight().setParent(node);

}

leftNode.setParent(node.getParent());

if (node.getParent() == NIL) {

root = leftNode;

} else if (node == node.getParent().getLeft()) {

node.getParent().setLeft(leftNode);

} else {

node.getParent().setRight(leftNode);

}

leftNode.setRight(node);

leftNode.getRight().setParent(leftNode);

}

//中序遍历红黑树

public void printTree() {

inOrderTraverse(root);

}

private void inOrderTraverse(Node node) {

if (node != NIL) {

inOrderTraverse(node.getLeft());

System.out.println(" 节点:"+node.getValue() + "的颜色为:" + node.getColor());

inOrderTraverse(node.getRight());

}

}

public Node getNIL() {

return NIL;

}

}

class Node {

private Node left;

private Node right;

private Node parent;

private Color color;

private int value;

public Node(Node left, Node right, Node parent, Color color, int value) {

super();

this.left = left;

this.right = right;

this.parent = parent;

this.color = color;

this.value = value;

}

public Node() {

}

public Node(int value) {

this(null,null,null,null,value);

}

public Node getLeft() {

return left;

}

public void setLeft(Node left) {

this.left = left;

}

public Node getRight() {

return right;

}

public void setRight(Node right) {

this.right = right;

}

public Node getParent() {

return parent;

}

public void setParent(Node parent) {

this.parent = parent;

}

public Color getColor() {

return color;

}

public void setColor(Color color) {

this.color = color;

}

public int getValue() {

return value;

}

public void setValue(int value) {

this.value = value;

}

}

enum Color {

RED,BLACK

}

public class RBTreeTest {

/**

* @param args

*/

public static void main(String[] args) {

RBTree rbTree = new RBTree();

rbTree.insert(41);

rbTree.insert(31);

rbTree.insert(12);

rbTree.insert(19);

rbTree.insert(8);

rbTree.insert(11);

//rbTree.printTree();

// rbTree.rbDelete(19);

rbTree.printTree();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: