用java举一个红黑树的例子
时间: 2023-12-25 07:51:46 浏览: 30
以下是一个用Java实现的红黑树示例:
```java
class Node {
int value;
Node parent;
Node left;
Node right;
boolean isRed;
public Node(int value, Node parent, Node left, Node right, boolean isRed) {
this.value = value;
this.parent = parent;
this.left = left;
this.right = right;
this.isRed = isRed;
}
}
public class RedBlackTree {
private Node root;
public void insert(int value) {
Node newNode = new Node(value, null, null, null, true);
if (root == null) {
root = newNode;
} else {
Node current = root;
Node parent = null;
while (true) {
parent = current;
if (value < current.value) {
current = current.left;
if (current == null) {
parent.left = newNode;
newNode.parent = parent;
fixRedBlackTree(newNode);
return;
}
} else {
current = current.right;
if (current == null) {
parent.right = newNode;
newNode.parent = parent;
fixRedBlackTree(newNode);
return;
}
}
}
}
}
private void fixRedBlackTree(Node node) {
while (node.parent != null && node.parent.isRed) {
Node parent = node.parent;
Node grandParent = parent.parent;
if (parent == grandParent.left) {
Node uncle = grandParent.right;
if (uncle != null && uncle.isRed) {
grandParent.isRed = true;
parent.isRed = false;
uncle.isRed = false;
node = grandParent;
} else {
if (node == parent.right) {
rotateLeft(parent);
node = parent;
parent = node.parent;
}
parent.isRed = false;
grandParent.isRed = true;
rotateRight(grandParent);
}
} else {
Node uncle = grandParent.left;
if (uncle != null && uncle.isRed) {
grandParent.isRed = true;
parent.isRed = false;
uncle.isRed = false;
node = grandParent;
} else {
if (node == parent.left) {
rotateRight(parent);
node = parent;
parent = node.parent;
}
parent.isRed = false;
grandParent.isRed = true;
rotateLeft(grandParent);
}
}
}
root.isRed = false;
}
private void rotateLeft(Node node) {
Node rightChild = node.right;
node.right = rightChild.left;
if (rightChild.left != null) {
rightChild.left.parent = node;
}
rightChild.parent = node.parent;
if (node.parent == null) {
root = rightChild;
} else if (node == node.parent.left) {
node.parent.left = rightChild;
} else {
node.parent.right = rightChild;
}
rightChild.left = node;
node.parent = rightChild;
}
private void rotateRight(Node node) {
Node leftChild = node.left;
node.left = leftChild.right;
if (leftChild.right != null) {
leftChild.right.parent = node;
}
leftChild.parent = node.parent;
if (node.parent == null) {
root = leftChild;
} else if (node == node.parent.right) {
node.parent.right = leftChild;
} else {
node.parent.left = leftChild;
}
leftChild.right = node;
node.parent = leftChild;
}
}
```
这段代码实现了红黑树的插入操作,并且在插入后保证了红黑树的性质。在插入新节点后,如果发现需要调整红黑树,就会执行 `fixRedBlackTree` 方法来进行调整。该方法使用了红黑树的调整规则,包括左旋、右旋和变色操作。