import java.util.ArrayList;
import java.util.List;
public class BinarySearchTree<Key extends Comparable<Key>, Value> {
Node<Key, Value> root;
Node get(Node node, Key k) {
if (node == null) {
return null;
}
int cmp = node.k.compareTo(k);
if (cmp > 0) {
return get(node.left, k);
} else if (cmp < 0) {
return get(node.right, k);
} else {
return node;
}
}
int size(Node node) {
if (node == null) {
return 0;
}
return node.N;
}
void put(Key k, Value v) {
root = put(root, k, v);
}
Node put(Node node, Key k, Value v) {
if (node == null) {
return new Node(k, v, 1);
}
int cmp = node.k.compareTo(k);
if (cmp > 0) {
node.left = put(node.left, k, v);
} else if (cmp < 0) {
node.right = put(node.right, k, v);
} else {
node.v = v;
}
node.N = size(node.left) + size(node.right) + 1;
return node;
}
void HierarchicalTraversal() {
HierarchicalTraversal(root);
}
void deleteMin() {
root = deleteMin(root);
}
Node deleteMin(Node node) {
if (node == null) {
return null;
}
if (node.left == null) {
return node.right;
} else {
node.N = node.N - 1;
node.left = deleteMin(node.left);
return node;
}
}
/**
* 层序遍历
*/
void HierarchicalTraversal(Node node) {
if (node == null) {
return;
}
List<Node> list = new ArrayList<Node>();
list.add(node);
while (!list.isEmpty()) {
Node tmp = list.remove(0);
System.out.println(tmp.k + "--" + tmp.v + ",N=" + tmp.N);
if (tmp.left != null) {
list.add(tmp.left);
}
if (tmp.right != null) {
list.add(tmp.right);
}
}
}
public static void main(String[] args) {
Integer[] keys = {6, 5, 4, 2, 3};
char[] values = {'a', 'b', 'c', 'd', 'e'};
BinarySearchTree<Integer, Character> bst = new BinarySearchTree<Integer, Character>();
for (int i = 0; i < keys.length; i++) {
bst.put(keys[i], values[i]);
}
bst.HierarchicalTraversal();
bst.deleteMin();
System.out.println("----------------");
bst.HierarchicalTraversal();
bst.deleteMin();
System.out.println("----------------");
bst.HierarchicalTraversal();
bst.deleteMin();
System.out.println("----------------");
bst.HierarchicalTraversal();
}
}
class Node<Key extends Comparable<Key>, Value> {
Node left, right;
/**
* N = 该节点及其后代的数量
*/
int N;
Key k;
Value v;
public Node(Key k, Value v, int N) {
this.k = k;
this.v = v;
this.N = N;
}
}
参考书籍:《算法》[美] Robert Sedgewick,[美] Kevin Wayne 著,谢路云 译