【发布时间】:2014-08-21 08:51:48
【问题描述】:
今天和同事都写了一个java遍历树的方法。他以迭代的方式做到这一点,而我则递归。想象以下对象:
class TreeElement {
private List<TreeElement> children;
// Getters and setters...
}
以及两种可能的遍历方式:
方法一:
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());
}
}
方法二:
void traverseTree2(TreeElement element) {
handleElement(element);
for (TreeElement child : element.getChildren()) {
traverseTree2(child);
}
}
我现在的问题是,关于执行时间和内存使用情况,应该使用哪种方法?有什么真正的区别,还是编译器对代码进行了如此多的优化以至于没有?
PS:元素的遍历顺序并不重要。
【问题讨论】:
-
方法二:调用自身。我认为这符合递归的条件。
-
你确定这些方法是等价的吗?我认为第二个将按深度探索节点,而第一个按广度探索节点
标签: java recursion tree iteration