今天一位同事和我都写了一个方法来遍历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:遍历元素的顺序并不重要。
答案 0 :(得分:1)
我敢打赌,这两种方法在执行时间方面几乎相同。您可以使用类似Queue
而不是List
的内容来改进第一个。
但是,如果树很大,方法2可能会获得StackOverflowError
。使用方法1可以避免这种情况。
答案 1 :(得分:1)
如果您担心方法性能,那么运行代码并对其进行分析可能符合您的最佳利益。没有其他任何人可以明确地告诉你哪种方法会表现得更好。
答案 2 :(得分:0)
关于内存使用情况,traverseTree2方法看起来更好,因为避免实例化ArrayList对象,它也会对性能产生一点干扰,因为创建对象总是需要一些时间。我将用于traverseTree2方法。