除了刪除節點之外,把紅黑樹基本上看完了,順手用java實現了一棵紅黑樹
import javax.swing.*;
/**
* Created by eminem on 16-11-15.
*/
public class brTree {
private Node root;
private static final boolean RED = true;
private static final boolean BLACK = false;
private class Node {
String key;
int value;
Node left, right;
int N;
boolean color;
public Node(String key, int value, int N, boolean color) {
this.key = key;
this.value = value;
this.N = N;
this.color = color;
}
}
private boolean isRed(Node x) {
//空鏈接那麼他就是black
if (x == null) return false;
return x.color == RED;
}
int size(Node shit) {
if (shit == null) return 0;
else return shit.N;
}
Node rotateLfet(Node h) {
Node x = h.right;
h.right = x.left;
x.left = h;
x.color = h.color;
h.color = RED;
x.N = h.N;
h.N = size(h.left) + size(h.right) + 1;
return x;
}
Node rotateRight(Node h) {
Node x = h.left;
h.left = x.right;
x.right = h;
x.color = h.color;
h.color = RED;
x.N = h.N;
h.N = size(h.left) + size(h.right) + 1;
return x;
}
private void flipColors(Node shit) {
shit.color = RED;
shit.left.color = BLACK;
shit.right.color = BLACK;
}
public void put(String key, int value) {
root = put(root, key, value);
root.color = BLACK;
}
private Node put(Node shit, String key, int value) {
if (shit == null) {
return new Node(key, value, 1, RED);
}
int cmp = key.compareTo(shit.key);
if (cmp < 0) shit.left = put(shit.left, key, value);
else if (cmp > 0) shit.right = put(shit.right, key, value);
else shit.value = value;
if (isRed(shit.right) && !isRed(shit.left)) shit = rotateLfet(shit);
if (isRed(shit.left) && isRed(shit.left.left)) shit = rotateRight(shit);
if (isRed(shit.left) && isRed(shit.right)) flipColors(shit);
shit.N = size(shit.left) + size(shit.right) + 1;
return shit;
}
public int get(String key) {
return get(root, key);
}
private Integer get(Node x, String key) {
if (x == null) return null;
int cmp = key.compareTo(x.key);
if (cmp > 0) {
return get(x.right, key);
} else if (cmp < 0) {
return get(x.left, key);
} else {
return x.value;
}
}
public String min() {
return min(root).key;
}
private Node min(Node x) {
if (x.left == null) return x;
return min(x.left);
}
public String max() {
return max(root).key;
}
private Node max(Node x) {
if (x.right == null) return x;
return max(x.right);
}
public String floor(String key) {
Node x = floor(root, key);
if (x == null) return null;
return x.key;
}
private Node floor(Node x, String key) {
if (x == null) return null;
int cmp = key.compareTo(x.key);
if (cmp == 0) return x;
if (cmp < 0) return floor(x.left, key);
Node t = floor(x.right, key);
if (t != null) return t;
else return x;
}
//找到排名爲k的鍵
public String select(int k) {
return select(root, k).key;
}
private Node select(Node x, int k) {
if (x == null) return null;
int t = size(x.left);
if (t > k) return select(x.left, k);
else if (t < k) return select(x.right, k - t - 1);
else return x;
}
public int rank(String key) {
return rank(root, key);
}
private Integer rank(Node x, String key) {
//始終沒命中,已到樹的末尾
if (x == null) return 0;
int cmp = key.compareTo(x.key);
if (cmp < 0) return rank(x.left, key);
else if (cmp > 0) return 1 + size(x.left) + rank(x.right ,key);
else return size(x.left);
}
}
//md這些算法的發明者也是吊,怎麼想出來的啊這東西
測試類如下:
/**
* Created by eminem on 16-11-17.
*/
public class brTestt {
public static void main(String[] args) {
brTree fuck=new brTree();
fuck.put("a",1);
fuck.put("b",2);
fuck.put("c",3);
fuck.put("d",4);
fuck.put("e",5);
fuck.put("f",6);
fuck.put("g",7);
fuck.put("h",8);
System.out.println(fuck.select(7));
System.out.println(fuck.get("a"));
System.out.println(fuck.floor("o"));
}
}