package 二叉排序树; import java.util.LinkedList; import java.util.Queue; 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; N = n; } } public int size() { return size(root); } public int size(Node root) { if (root == null) return 0; else return root.N; } public Value get(Key key) { return get(root, key); } public Value get(Node root, Key key) { if (root == null) return null; int vmp = key.compareTo(root.key); if (vmp < 0) return get(root.left, key); else if (vmp > 0) return get(root.right, key); else return root.val; } public void put(Key key, Value val) { root = put(root, key, val); } public Node put(Node root, Key key, Value value) { if (root == null) return new Node(key, value, 1); int cmp = key.compareTo(root.key); if (cmp < 0) root.left = put(root.left, key, value); else if (cmp > 0) root.right = put(root.right, key, value); else root.val = value; root.N = size(root.left) + size(root.right) + 1; return root; } public Key min() { return min(root).key; } private Node min(Node root) { if (root.left == null) return root; return min(root.left); } public Key floor(Key key) { Node x = floor(root, key); if (x == null) return null; return x.key; } //向下取整,小于等于key的最大值 private Node floor(Node x, Key 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; } public Key max() { return max(root).key; } private Node max(Node x) { if (x.right == null) return x; return max(x.right); } public Key ceiling(Key key) { return ceiling(root, key).key; } private Node ceiling(Node x, Key key) { if (x == null) return null; int cmp = key.compareTo(x.key); if (cmp == 0) return x; else if (cmp > 0) return ceiling(x.right, key); Node t = floor(x.left, key); if (t != null) return t; else return x; } public Key select(int k) { return select(root, k).key; } //选择,找到排名为K 的节点 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(Key key) { return rank(key, root); } //返回给定键的排名 private int rank(Key key, Node x) { if (x == null) return 0; int cmp = key.compareTo(x.key); if (cmp < 0) return rank(key, x.left); else if (cmp > 0) return 1 + size(x.left) + rank(key, x.right); else return size(x.left); } //删除最大键 public void deleteMax() { } // 删除最小建 public void deleteMin() { root = deleteMin(root); } private Node deleteMin(Node x) { if (x.left == null) return x.right; x.left = deleteMin(x.left); x.N = size(x.left) + size(x.right) + 1; return x; } public void delete(Key key) { root = delete(root, key); } private Node delete(Node x, Key key) { if (x == null) return null; int cmp = key.compareTo(x.key); if (cmp < 0) x.left = delete(x.left, key); else if (cmp > 0) x.right = delete(x.right, key); else { if (x.right == null) return x.left; if (x.left == null) return x.right; Node t = x; x = min(t.right); x.right = deleteMin(t.right); x.left = t.left; } x.N = size(x.left) + size(x.right) + 1; return x; } // 查找范围 public Iterable<Key> keys(){ return keys(min(),max()); } private Iterable<Key> keys(Key lo,Key hi){ Queue<Key> queue=new LinkedList<>(); keys(root,queue,lo,hi); return queue; } private void keys(Node x,Queue<Key> queue,Key lo,Key hi){ if(x==null)return; int cmplo=lo.compareTo(x.key); int cmphi=hi.compareTo(x.key); if(cmplo<0) keys(x.left,queue,lo,hi); if(cmplo<=0&&cmphi>=0) queue.offer(x.key); if(cmphi>0) keys(x.right,queue,lo,hi); } }