在下面的代码中,始终打印后序树遍历的节点 我想知道是否有办法将这些节点存储在数组中的后序列中 我是否必须以迭代的方式进行遍历?
public static void postOrder(TreeNode root) {
if (root != null) {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.item + " ");
} else {
return;
}
}
答案 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
- 甚至是原始数组。