public void delete(LinkSetNode n) {
        if (n == null)
            return;  // Key not found, do nothing
        if (n.left != null && n.right != null) {
            // Copy key/value from predecessor and then delete it instead
            LinkSetNode pred = maximumNode(n.left);
            n.s = pred.s;
            n.d = pred.d;
            n.w = pred.w;
            n = pred;
        }
        assert n.left == null || n.right == null;
        LinkSetNode child = (n.right == null) ? n.left : n.right;
        if (nodeColor(n) == NodeColor.BLACK)
        {
            n.color = nodeColor(child);
            deleteCase1(n);
        }
        replaceNode(n, child);
        if (nodeColor(root) == NodeColor.RED)
        {
            root.color = NodeColor.BLACK;
        }
        size--;
    }