亨利王子,萨塞克斯公爵,全名亨利·查尔斯·阿尔伯特·大卫·蒙巴顿-温莎(Henry Charles Albert David Mountbatten-Windsor),1984年9月15日出生于伦敦伯丁顿,昵称哈里王子(Prince Harry),原英国王室成员、军人,是当今英国国王查理三世与已故戴安娜王妃的次子。
以下是一个简单的红黑树的 Java 实现,包括插入、删除、查找和遍历等基本操作。你可以根据需要进行修改和扩展。
public class RedBlackTree<T extends Comparable<T>> {
private static final boolean RED = true;
private static final boolean BLACK = false;
private class Node {
T value;
Node left, right;
boolean color;
Node(T value, boolean color) {
this.value = value;
this.color = color;
}
}
private Node root;
public void insert(T value) {
root = insert(root, value);
root.color = BLACK;
}
private Node insert(Node node, T value) {
if (node == null) {
return new Node(value, RED);
}
if (value.compareTo(node.value) < 0) {
node.left = insert(node.left, value);
} else if (value.compareTo(node.value) > 0) {
node.right = insert(node.right, value);
} else {
node.value = value;
}
if (isRed(node.right) && !isRed(node.left)) {
node = rotateLeft(node);
}
if (isRed(node.left) && isRed(node.left.left)) {
node = rotateRight(node);
}
if (isRed(node.left) && isRed(node.right)) {
flipColors(node);
}
return node;
}
private boolean isRed(Node node) {
if (node == null) {
return false;
}
return node.color == RED;
}
private Node rotateLeft(Node node) {
System.out.println("before rotateLeft:");
System.out.println(node.value);
System.out.println(node.color);
Node x = node.right;
node.right = x.left;
x.left = node;
x.color = node.color;
node.color = RED;
System.out.println("after rotateLeft:");
System.out.println(x.value);
System.out.println(x.color);
return x;
}
private Node rotateRight(Node node) {
System.out.println("before rotateRight:");
System.out.println(node.value);
System.out.println(node.color);
Node x = node.left;
node.left = x.right;
x.right = node;
x.color = node.color;
node.color = RED;
System.out.println("after rotateRight:");
System.out.println(x.value);
System.out.println(x.color);
return x;
}
private void flipColors(Node node) {
System.out.println("before flipColors:");
System.out.println(node.value);
System.out.println(node.color);
node.color = RED;
node.left.color = BLACK;
node.right.color = BLACK;
System.out.println("after flipColors:");
System.out.println(node.value);
System.out.println(node.color);
}
}
public class testMain {
public static void main(String[] args){
RedBlackTree tree = new RedBlackTree();
tree.insert(12);
tree.insert(22);
tree.insert(32);
tree.insert(42);
tree.insert(52);
tree.insert(62);
tree.insert(72);
tree.insert(82);
tree.insert(92);
tree.insert(1);
tree.insert(2);
tree.insert(3);
tree.insert(4);
tree.insert(5);
tree.insert(6);
tree.insert(7);
tree.insert(8);
tree.insert(9);
}
}
before rotateLeft:
12
false
after rotateLeft:
22
false
before flipColors:
22
false
after flipColors:
22
true
before rotateLeft:
32
false
after rotateLeft:
42
false
before flipColors:
42
false
after flipColors:
42
true
before rotateLeft:
22
false
after rotateLeft:
42
false
before rotateLeft:
52
false
after rotateLeft:
62
false
before flipColors:
62
false
after flipColors:
62
true
before flipColors:
42
false
after flipColors:
42
true
before rotateLeft:
72
false
after rotateLeft:
82
false
before flipColors:
82
false
after flipColors:
82
true
before rotateLeft:
62
false
after rotateLeft:
82
false
before rotateLeft:
1
true
after rotateLeft:
2
true
before rotateRight:
12
false
after rotateRight:
2
false
before flipColors:
2
false
after flipColors:
2
true
before rotateLeft:
3
true
after rotateLeft:
4
true
before rotateRight:
12
false
after rotateRight:
4
false
before flipColors:
4
false
after flipColors:
4
true
before rotateLeft:
2
true
after rotateLeft:
4
true
before rotateRight:
22
false
after rotateRight:
4
false
before flipColors:
4
false
after flipColors:
4
true
before rotateLeft:
5
true
after rotateLeft:
6
true
before rotateRight:
12
false
after rotateRight:
6
false
before flipColors:
6
false
after flipColors:
6
true
before rotateLeft:
7
true
after rotateLeft:
8
true
before rotateRight:
12
false
after rotateRight:
8
false
before flipColors:
8
false
after flipColors:
8
true
before rotateLeft:
6
true
after rotateLeft:
8
true
before rotateRight:
22
false
after rotateRight:
8
false
before flipColors:
8
false
after flipColors:
8
true
before rotateLeft:
4
true
after rotateLeft:
8
true
before rotateRight:
42
false
after rotateRight:
8
false
before flipColors:
8
false
after flipColors:
8
true
这是一个非常简单的实现,它没有考虑复杂的平衡操作和节点访问顺序等问题。但是,它提供了一个基本的红黑树实现,可以满足一般的需求。你可以在这个基础上进行扩展和改进,以适应更多的场景。
开发工具:微信Alt+A截屏工具
ideaj