public static <V> List<V> postOrderList(final ValueBinaryTreeNode<? extends V> root) {
        final List<V> result = new LinkedList<V>();
        final LinkedList<ValueBinaryTreeNode<? extends V>> nodesToCompile = new LinkedList<>();
        final Set<ValueBinaryTreeNode<? extends V>> nodesCompiled = new HashSet<>();
        addToList(nodesToCompile, root);
        while (!nodesToCompile.isEmpty()) {
            final ValueBinaryTreeNode<? extends V> node = nodesToCompile.removeFirst();
            if (nodesCompiled.contains(node) || (node.getLeft() == null && node.getRight() == null)) {
                result.add(node.getValue());
            } else {
                addToList(nodesToCompile, node);
                addToList(nodesToCompile, node.getRight());
                addToList(nodesToCompile, node.getLeft());
                nodesCompiled.add(node);
            }
        }
        return result;
    }