@Override
    public Iterator<K> preorder(K low, K high)
    {
        if (low == null || high == null)
        {
            throw new IllegalArgumentException();
        }
        if (low.compareTo(high) > 0)
        {
            throw new IllegalArgumentException();
        }
        if (root == null)
        {
            return new ArrayList<K>().iterator();
        }
        ArrayList<K> keys = new ArrayList<K>(root.size);
        Stack<Node<K, V>> nodes = new ArrayList<Node<K, V>>();
        nodes.push(root);
        while (!nodes.empty())
        {
            Node<K, V> node = nodes.pop();
            if (low.compareTo(node.key) <= 0 && high.compareTo(node.key) >= 0)
            {
                keys.add(node.key);
            }
            if (node.greater != null)
            {
                nodes.push(node.greater);
            }
            if (node.less != null)
            {
                nodes.push(node.less);
            }
        }
        return keys.iterator();
    }