public class BST<Key extends Comparable<Key>, Value>{ private Node root; // 根节点 private class Node { private Key key; // 键 private Value val; // 值 private Node left, right; // 指向子树的链接 private int N; // 以该结点为根的子树中的结点总数 public Node(Key key, Value val, int N) { this.key = key; this.val = val; this.N = N; } } public int size() { return size(root) } public int size(Node x) { if (x == null) return 0; else return x.N; } public Value get(Key key) { return get(root, key); } private Value get(Node x, Key key) { // 在以x为根节点的子树中查找并返回key所对应的值; // 如果找不到则返回null if (x == null) return null; int cmp = key.compareTo(x.key); if (cmp < 0) return get(x.left, key); // 左子结点 else if (cmp > 0) return get(x.right, key); // 右子结点 else return x.val; // 找到了! } public void put(Key key, Value val) { root = put(root, key, val); } private Node put(Node x, Key key, Vlaue val) { // 如果key存在于以x为根节点的子树中则更新它的值 // 否则将以key和val为键值对的新结点插入到该子树中 if (x == null) return new Node(key, val, 1); int cmp = key.compareTo(x.key); if (cmp < 0) x.left = put(x.left, key, val); else if (cmp > 0) x.right = put(x.right, key, val); else x.val = val; x.N = size(x.left) + size(x.right) + 1; // 插入后每个结点的计算器 +1 return x; }}