Site Search:

forth leaf

Back>
go deep
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) {  //
        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, Value 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;
        return x;
    }
    public Key min() {return min(root).key;}  //
    
    private Node min(Node x) {
        if(x.left == null) return x;
        return min(x.left);
    }
    //I don't remember, ask Anita
    public Key floor(Key key) {
        //TODO: ???
    }
    private Node floor(Node x, Key key) {
        if(x == null) return null;
        int cmp = key. (x.key);
        if(cmp == 0) x;
        if(cmp < 0) return floor(x.left, key);
        Node t = floor(x.right, key);
        if(t != null)  t;
        else  x;
    }
    public Key select(int k) { return (root, k).key;}
    private Node (Node x, int k) {//
        if(x == null)  null;
        int t = (x.left);
        if(t > k)   (x., k);
        if(t < k)   (x., k-t-1);
         x;
    }
    public int rank(Key key) { return rank(key, root);}
    private int rank(Key , Node x) {//
        if(x == null) return 0;
        int cmp = . (x.);
        if(cmp < 0)  rank(, x.left);
        if(cmp > 0)  1 + size(x.left) + rank(, x.right);
          size(x.left);
    }
    public void deletMin() {root = deleteMin(root);}
    private Node deleteMin(Node x) {
        if(x.left == null)  x.right;
        x.left = deleteMin(x.left);
        x.N = (x.left) + (x.right) + 1;
         x;
    }
    public void delete(Key key) {//,,
        root = delete(root, key);
    }
    private Node (Node x, Key ) {
        if(x == null) null;
        int cmp = .compareTo(x.);
        if(cmp < 0) x. = (x.left, );
        else if(cmp > 0) x.right = (x.right, );
        else {
            if(x.right == null)  x.;
            if(x. == null)  x.right;
            Node t = x;
            x = min(t.right);
            x.right = Min(t.right);
            x. = t.;
        }
        x.N = (x.) + (x.right) + 1;
         x;
        }
    }
    public Iterable<Key> keys() { return keys(min(), max()); }
    public Iterable<Key> keys(Key lo, Key hi) {//Sadindriya
        Queue<Key> ि = new Queue<Key>();
        keys(root, ि, lo, hi);
         ि;
    }
    private void keys(Node x, Queue<Key> ि, Key lo, Key hi) {
        if(x == null) return;
        int cmplo = lo. (x.key);
        int cmphi = hi. (x.key);
        if(cmplo < 0) keys(x.left, queue, lo, hi);
        if(cmphi <= 0 && cmphi >= 0) queue.enqueue(x.key);
        if(cmphi > 0) keys(x.right, ि, lo, hi);
    }
}

No comments:

Post a Comment