请用Java写一个红黑树
时间: 2023-09-08 19:04:54 浏览: 59
### 回答1:
我不是很熟悉Java,但我可以尝试提供一些指导。首先,你需要明确定义一棵红黑树的属性,包括根节点、左右子节点和颜色。然后,你需要实现红黑树的插入操作,其中需要考虑不同情况下的旋转和重新着色操作。最后,你需要实现红黑树的搜索操作,主要是用于查找指定节点的操作。
### 回答2:
红黑树是一种自平衡的二叉搜索树,具有良好的插入、删除和查找性能。下面是使用Java语言实现红黑树的示例代码:
```java
public class RedBlackTree {
private static final boolean RED = true;
private static final boolean BLACK = false;
private static class Node {
int key;
Node left;
Node right;
Node parent;
boolean color;
public Node(int key, boolean color) {
this.key = key;
this.color = color;
}
}
private Node root;
public void insert(int key) {
Node newNode = new Node(key, RED);
Node current = root;
Node parent = null;
while (current != null) {
parent = current;
if (key < current.key) {
current = current.left;
} else {
current = current.right;
}
}
newNode.parent = parent;
if (parent == null) {
root = newNode;
} else if (key < parent.key) {
parent.left = newNode;
} else {
parent.right = newNode;
}
fixInsertion(newNode);
}
private void fixInsertion(Node node) {
while (node != root && node.parent.color == RED) {
if (node.parent == node.parent.parent.left) {
Node uncle = node.parent.parent.right;
if (uncle != null && uncle.color == RED) {
node.parent.color = BLACK;
uncle.color = BLACK;
node.parent.parent.color = RED;
node = node.parent.parent;
} else {
if (node == node.parent.right) {
node = node.parent;
rotateLeft(node);
}
node.parent.color = BLACK;
node.parent.parent.color = RED;
rotateRight(node.parent.parent);
}
} else {
Node uncle = node.parent.parent.left;
if (uncle != null && uncle.color == RED) {
node.parent.color = BLACK;
uncle.color = BLACK;
node.parent.parent.color = RED;
node = node.parent.parent;
} else {
if (node == node.parent.left) {
node = node.parent;
rotateRight(node);
}
node.parent.color = BLACK;
node.parent.parent.color = RED;
rotateLeft(node.parent.parent);
}
}
}
root.color = BLACK;
}
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;
}
// 其他方法包括delete、search等树的操作方法
// 测试代码
public static void main(String[] args) {
RedBlackTree tree = new RedBlackTree();
tree.insert(10);
tree.insert(20);
tree.insert(30);
tree.insert(15);
tree.insert(25);
tree.insert(5);
tree.insert(6);
// 输出红黑树的中序遍历结果
tree.inOrderTraversal(tree.root);
}
private void inOrderTraversal(Node node) {
if (node != null) {
inOrderTraversal(node.left);
System.out.print(node.key + " ");
inOrderTraversal(node.right);
}
}
}
```
以上是一个简单的红黑树的Java实现。通过插入示例节点,可以看到红黑树的中序遍历结果为5 6 10 15 20 25 30。你可以根据自己的需求来编写更加复杂和完善的红黑树代码。
### 回答3:
红黑树是一种自平衡的二叉查找树,其中每个节点都有一个额外的位表示节点的颜色,可以是红色或黑色。红黑树具有以下五个特性:
1. 每个节点都有一个颜色,要么是红色,要么是黑色。
2. 根节点是黑色的。
3. 所有叶子节点(NIL节点,即空节点)都是黑色的。
4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
5. 对于每个节点,从该节点到其后代的叶子节点的所有路径上,包括该节点自身,黑色节点的数量相同。
下面是用Java实现红黑树的简单代码示例:
```java
// 定义红黑树节点类
class Node {
int data; // 节点值
Node parent; // 父节点
Node left; // 左子节点
Node right; // 右子节点
int color; // 节点颜色,0表示黑色,1表示红色
// 构造函数
public Node(int data) {
this.data = data;
}
}
// 红黑树类
class RedBlackTree {
private Node root; // 根节点
// 插入节点
public void insert(int data) {
Node newNode = new Node(data); // 创建新节点
if (root == null) {
root = newNode;
root.color = 0; // 根节点为黑色
} else {
Node current = root;
Node parent;
while (true) {
parent = current;
if (data < current.data) {
current = current.left;
if (current == null) {
parent.left = newNode;
newNode.parent = parent;
fixTree(newNode);
return;
}
} else {
current = current.right;
if (current == null) {
parent.right = newNode;
newNode.parent = parent;
fixTree(newNode);
return;
}
}
}
}
}
// 修复红黑树
private void fixTree(Node node) {
while (node.parent != null && node.parent.color == 1) {
if (node.parent == node.parent.parent.left) {
Node uncle = node.parent.parent.right;
if (uncle != null && uncle.color == 1) {
node.parent.color = 0;
uncle.color = 0;
node.parent.parent.color = 1;
node = node.parent.parent;
} else {
if (node == node.parent.right) {
node = node.parent;
rotateLeft(node);
}
node.parent.color = 0;
node.parent.parent.color = 1;
rotateRight(node.parent.parent);
}
} else {
Node uncle = node.parent.parent.left;
if (uncle != null && uncle.color == 1) {
node.parent.color = 0;
uncle.color = 0;
node.parent.parent.color = 1;
node = node.parent.parent;
} else {
if (node == node.parent.left) {
node = node.parent;
rotateRight(node);
}
node.parent.color = 0;
node.parent.parent.color = 1;
rotateLeft(node.parent.parent);
}
}
}
root.color = 0;
}
// 左旋转
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;
}
}
// 测试红黑树
public class TestRedBlackTree {
public static void main(String[] args) {
RedBlackTree tree = new RedBlackTree();
// 插入节点
tree.insert(10);
tree.insert(20);
tree.insert(30);
tree.insert(15);
tree.insert(25);
tree.insert(5);
// 输出红黑树节点值
printTree(tree.getRoot());
}
// 输出红黑树节点值(中序遍历)
public static void printTree(Node node) {
if (node != null) {
printTree(node.left);
System.out.println(node.data + " ");
printTree(node.right);
}
}
}
```
上述代码中,我们首先定义了一个`Node`类来表示红黑树的节点。在`RedBlackTree`类中,我们实现了插入节点的方法`insert`以及红黑树修复的方法`fixTree`,其中使用了左旋转`rotateLeft`和右旋转`rotateRight`来保持红黑树的平衡。最后,我们在`TestRedBlackTree`类中测试了红黑树的插入操作,并输出红黑树的节点值。