在数组中存储后序序列

时间:2010-03-06 14:05:35

标签: java

在下面的代码中,始终打印后序树遍历的节点 我想知道是否有办法将这些节点存储在数组中的后序列中 我是否必须以迭代的方式进行遍历?

public static void postOrder(TreeNode root) {
  if (root != null) {
    postOrder(root.left);
    postOrder(root.right);
    System.out.print(root.item + "  ");
  } else {
    return;
  }
}

3 个答案:

答案 0 :(得分:1)

只需将List与该方法一起传递即可。未经测试的伪代码:

class Tree {

    private TreeNode root;

    // ...

    public List<TreeNode> postOrder() {
        List<TreeNode> nodes = new ArrayList<TreeNode>();  
        fillList(root, nodes);
        return nodes;
    }

    private void fillList(TreeNode node, List<TreeNode> nodeList) { // private!
        if(node != null) {
            fillList(node.left, nodeList);
            fillList(node.right, nodeList);
            nodeList.add(node);
        }
    }
}

答案 1 :(得分:0)

我建议使用列表而不是数组。这样您就不必担心树的大小了。 (使用数组,您应首先计算树中的节点,这实际上需要另一次完整遍历。)通过此方法可以实现存储树节点:

public static void postOrder(TreeNode root, List<TreeNode> list) {

    if (root != null) {
        postOrder(root.left, list);
        postOrder(root.right, list);
        list.add(root);
    } else {
        return;
    }
}

如果您只想存储项目(假设其类型为TreeNodeItem):

public static void postOrder(TreeNode root, List<TreeNodeItem> list) {

    if (root != null) {
        postOrder(root.left, list);
        postOrder(root.right, list);
        list.add(root.item);
    } else {
        return;
    }
}

答案 2 :(得分:0)

创建最终数组的需求很难看,但这是一个模型,包括类型TreeNode的潜在定义:

final class TreeAccumulator
{
  public static final class TreeNode<T>
  {
    public TreeNode(T item,
                    TreeNode<? extends T> left,
                    TreeNode<? extends T> right) {
      this.item = item;
      this.left = left;
      this.right = right;
    }

    public final T item;
    public final TreeNode<? extends T> left;
    public final TreeNode<? extends T> right;
  }


  public static <T, C extends Collection<T>>
  C postOrder(TreeNode<? extends T> root, C acc)
  {
    if (null == root)
      return acc;

    final C result = postOrder(root.right,
                               postOrder(root.left, acc));
    result.add(root.item);
    return result;
  }


  @SuppressWarnings({"unchecked"})
  public static <T> T[] postOrder(TreeNode<? extends T> root,
                                  Class<T> c)
  {
    final Collection<T> acc = postOrder(root, new LinkedList<T>());
    return acc.toArray((T[])Array.newInstance(c, acc.size()));
  }
}

如果您提前了解树的潜在大小,则可以更轻松地收集到预先分配的ArrayList - 甚至是原始数组。