Java中的树遍历:迭代还是递归?

时间:2014-06-30 21:39:05

标签: java recursion tree iteration

今天一位同事和我都写了一个方法来遍历java中的一棵树。他以迭代的方式做到了,我递归了。想象一下以下对象:

class TreeElement {
    private List<TreeElement> children;
    // Getters and setters...
}

两种可能的遍历方法:

方法1:

void traverseTree1(TreeElement rootElement) {
    List<TreeElement> q = new ArrayList<TreeElement>();
    q.add(rootElement);
    while(!q.isEmpty()) {
        TreeElement elem = q.get(0);
        handleElement(elem);
        q.addAll(elem.getChildren());
    }
}

方法2:

void traverseTree2(TreeElement element) {
    handleElement(element);
    for (TreeElement child : element.getChildren()) {
        traverseTree2(child);
    }
}

现在我的问题是,应该使用哪种方法,关于执行时间和内存使用情况?是否存在任何真正的差异,或者编译器如何对代码进行了如此优化以至于没有?

PS:遍历元素的顺序并不重要。

3 个答案:

答案 0 :(得分:1)

我敢打赌,这两种方法在执行时间方面几乎相同。您可以使用类似Queue而不是List的内容来改进第一个。

但是,如果树很大,方法2可能会获得StackOverflowError。使用方法1可以避免这种情况。

答案 1 :(得分:1)

如果您担心方法性能,那么运行代码并对其进行分析可能符合您的最佳利益。没有其他任何人可以明确地告诉你哪种方法会表现得更好。

答案 2 :(得分:0)

关于内存使用情况,traverseTree2方法看起来更好,因为避免实例化ArrayList对象,它也会对性能产生一点干扰,因为创建对象总是需要一些时间。我将用于traverseTree2方法。