带返回类型数组的递归树遍历方法

时间:2013-06-08 05:11:30

标签: java arrays recursion binary-tree traversal

有没有办法以递归方式遍历树并返回一个作用于该递归方法的数组?

所以我最近回答了别人关于这个话题的问题。这个问题可以在这里找到:SO Question。我的解决方案使用递归范围之外的数组,因此该方法不能(或至少可能不应该)返回数组。但是,有没有办法编写一个遍历树的递归方法,以便返回一个数组?即使编写一个调用递归方法的初始方法也没关系,但我想不出一个好方法。

以下是我之前建议的代码:

private List nodeValues = new ArrayList();

public void traversePreRecursive(BinarySearchTreeNode node) 
{
    if (node != null)
    {
        nodeValues.add(node.getValue());
        traversePreRecursive(node.getLeft());
        traversePreRecursive(node.getRight());
    }
}

正如您所看到的,ArrayList超出了递归的范围 - 因此返回它并没有多大意义。有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

public static List traversePreRecursive(Node node) {
    if (node == null) return new ArrayList();

    List nodeValues = new ArrayList();
    nodeValues.add(node.getValue());
    nodeValues.addAll(traversePreRecursive(node.getLeft()));
    nodeValues.addAll(traversePreRecursive(node.getRight()));

    return nodeValues;
}

答案 1 :(得分:2)

有一种替代方案,但它涉及树上的两次传递。如果我的第一个答案中的数组操作让你感到悲伤,那么你只会使用这种方法。这种方法首先为每个节点提供一个索引(index()方法) - 基本上在我们实际创建数组之前计算出一个节点应该占用的数组元素。这也给了我一个节点数(size)。然后,我分配一个足够大的数组(list)来保存所有节点并将其传递给方法(addToList),该方法将节点引用复制到数组中先前标识的元素中。

public static List<Node> getNodes(Node a) {
    int size = index(a, 0);
    List<Node> list = new ArrayList<Node>(size);
    addToList(a, list);
    return list;
}

private static int index(Node node, int index) {
    if (node == null) return index;

    node.setIndex(index);
    int iLeft = index(node.getLeft(), index++);
    int iRight = index(node.getRight(), iLeft++);

    return iRight + 1;
}

private static void addToList(Node node, List<Node> list) {
    if(node == null) return;
    list.add(node.getIndex(), node);
    addToList(node.getLeft(), list);
    addToList(node.getRight(), list);
}

答案 2 :(得分:0)

在c中你可以有静态函数变量,(即,在函数的一次迭代中向列表中添加一个值意味着该值将在下一次迭代中列在列表中 - 如果列表是静态的)但是使用它们不是您提出的问题的最佳(最佳)解决方案。因此,我认为您正在搜索静态变量,但这不适合使用它们。