get paid to paste

red black java

import java.util.*; // for tests in main()

/*
 * get() and put() after: https://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/RedBlackBST.java.html
 */

public class RedBlackBST<Key extends Comparable<Key>, Val> {
        private static final boolean RED = true, BLACK = false;

        private Node root;

        private class Node {
                private Key      key;
                private Val      val;
                private Node     lft, rgt;
                private boolean  rob;
                private int      num;

                public Node(Key key, Val val) {
                        this.key = key;
                        this.val = val;
                        this.rob = RED;
                        this.num = 1;
                }
        }

        public RedBlackBST() {}

        private boolean isRed(Node tree) {
                if (tree == null)
                        return false;
                return tree.rob == RED;
        }
        private boolean isBlack(Node tree) {
                return !isRed(tree);
        }

        private int size(Node tree) {
                if (tree == null)
                        return 0;
                return tree.num;
        }

        private void update_size(Node tree) {
                tree.num = size(tree.lft) + size(tree.rgt) + 1;
        }

        private Node rotate_right(Node tree) {
                assert(tree != null && isRed(tree.lft));

                Node p = tree.lft;
                tree.lft = p.rgt;
                p.rgt = tree;
                p.rob = p.rgt.rob;
                p.rgt.rob = RED;
                p.num = tree.num;
                update_size(tree);
                return p;
        }

        private Node rotate_left(Node tree) {
                assert(tree != null && isRed(tree.rgt));

                Node p = tree.rgt;
                tree.rgt = p.lft;
                p.lft = tree;
                p.rob = p.lft.rob;
                p.lft.rob = RED;
                p.num = tree.num;
                update_size(tree);
                return p;
        }

        private void flip_colors(Node tree) {
                assert(tree != null);
                assert(tree.rgt != null && tree.lft != null);
                assert((isRed(tree) && isBlack(tree.lft) && isBlack(tree.rgt)) ||
                       (isBlack(tree) && isRed(tree.lft) && isRed(tree.rgt)));
                // for add(), always tree = black, left = red, right = red

                tree.rob = !tree.rob;
                tree.lft.rob = !tree.lft.rob;
                tree.rgt.rob = !tree.rgt.rob;
        }

        private Node put(Node tree, Key key, Val val) {
                if (tree == null)
                        return new Node(key, val);

                int cmp = key.compareTo(tree.key);
                if (cmp < 0)
                        tree.lft = put(tree.lft, key, val);
                else if (cmp > 0)
                        tree.rgt = put(tree.rgt, key, val);
                else
                        tree.val = val;

                if (isRed(tree.rgt) && isBlack(tree.lft))
                        tree = rotate_left(tree);
                if (isRed(tree.lft) && isRed(tree.lft.lft))
                        tree = rotate_right(tree);
                if (isRed(tree.lft) && isRed(tree.rgt))
                        flip_colors(tree);
                update_size(tree);
                return tree;
        }

        public void put(Key key, Val val) {
                root = put(root, key, val);
                root.rob = BLACK;
        }

        private Val get(Node tree, Key key) {
                while (tree != null) {
                        int cmp = key.compareTo(tree.key);

                        if (cmp < 0)
                                tree = tree.lft;
                        else if (cmp > 0)
                                tree = tree.rgt;
                        else
                                return tree.val;
                }
                return null;
        }

        public Val get(Key key) {
                return get(root, key);
        }

        public static void main(String[] args) {
                int n = Integer.parseInt(args[0]);

                Map<Integer, Integer> ht = new HashMap<>();
                RedBlackBST<Integer, Integer> bt = new RedBlackBST<>();

                for (int i = 0; i < n; i++) {
                        Integer k;
                        Integer v = (int)(Math.random() * 1000000000);

                        do {
                                k = (int)(Math.random() * 1000000000);
                        } while (ht.containsKey(k));
                        ht.put(k, v);
                        bt.put(k, v);
                }

                int count = 0;
                for (Map.Entry<Integer, Integer> pair: ht.entrySet()) {
                        Integer v = bt.get(pair.getKey());

                        if (v != null && pair.getValue().compareTo(v) == 0)
                                ++count;
                }
                System.out.println(count);
        }
}

Pasted: Jul 8, 2019, 11:11:50 pm
Views: 3