@Override
    public Iterator<K> inorder(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>>(root.size);
        Node<K, V> node = root;
        while (node != null)
        {
            nodes.push(node);
            node = node.less;
        }
        while (!nodes.empty())
        {
            node = nodes.pop();
            if (low.compareTo(node.key) <= 0 && high.compareTo(node.key) >= 0)
            {
                keys.add(node.key);
            }
            node = node.greater;
            while (node != null)
            {
                nodes.push(node);
                node = node.less;
            }
        }
        return keys.iterator();
    }