1. public class BST<Key extends Comparable<Key>, Value>
    2. {
    3. private Node root; // 根节点
    4. private class Node
    5. {
    6. private Key key; // 键
    7. private Value val; // 值
    8. private Node left, right; // 指向子树的链接
    9. private int N; // 以该结点为根的子树中的结点总数
    10. public Node(Key key, Value val, int N)
    11. { this.key = key; this.val = val; this.N = N; }
    12. }
    13. public int size()
    14. { return size(root) }
    15. public int size(Node x)
    16. {
    17. if (x == null) return 0;
    18. else return x.N;
    19. }
    20. public Value get(Key key)
    21. { return get(root, key); }
    22. private Value get(Node x, Key key)
    23. {
    24. // 在以x为根节点的子树中查找并返回key所对应的值;
    25. // 如果找不到则返回null
    26. if (x == null) return null;
    27. int cmp = key.compareTo(x.key);
    28. if (cmp < 0) return get(x.left, key); // 左子结点
    29. else if (cmp > 0) return get(x.right, key); // 右子结点
    30. else return x.val; // 找到了!
    31. }
    32. public void put(Key key, Value val)
    33. {
    34. root = put(root, key, val);
    35. }
    36. private Node put(Node x, Key key, Vlaue val)
    37. {
    38. // 如果key存在于以x为根节点的子树中则更新它的值
    39. // 否则将以key和val为键值对的新结点插入到该子树中
    40. if (x == null) return new Node(key, val, 1);
    41. int cmp = key.compareTo(x.key);
    42. if (cmp < 0) x.left = put(x.left, key, val);
    43. else if (cmp > 0) x.right = put(x.right, key, val);
    44. else x.val = val;
    45. x.N = size(x.left) + size(x.right) + 1; // 插入后每个结点的计算器 +1
    46. return x;
    47. }
    48. }