在一次采访中,我被要求找到树的深度。我递归地做了,但随后面试官让我用迭代来做。我尽我所能,但我认为他看起来并不相信。任何人都可以在这里写伪代码或代码更好...感谢阅读帖子。
答案 0 :(得分:2)
检查Way to go from recursion to iteration提供的答案。底线是您不必两次解决问题。如果你有一个非常好的递归算法,那么将它转换成迭代。
答案 1 :(得分:1)
Tree<Object> tree = ...; // source
class NodeMarker {
public NodeMarker(TreeNode node, int depth) { ... }
public TreeNode node;
public int depth;
}
int depth = 0;
List<NodeMarker> stack = new LinkedList<NodeMarker>();
for (TreeNode node : tree.getChildren())
stack.add(new NodeMarker(node, 1);
while (stack.size() > 1) {
NodeMarker marker = stack.get(0);
if (depth < marker.depth)
depth = marker.depth;
if (marker.node.hasChildren())
for (TreeNode node : marker.node.getChildren())
stack.add(new NodeMarker(node, marker.depth + 1);
}
答案 2 :(得分:0)
迭代而不是递归意味着你是在树下,而不是让每个函数调用产生两个新的函数调用,你可以将图层的每个成员存储在一个数组中。尝试从包含指向根的指针的(一个元素)数组开始。然后,在循环中(我只使用while(1))迭代该数组(currentLayer)并创建一个新数组(nextLayer)并将currentLayer中每个元素的子元素添加到nextLayer。如果nextlayer为空,那么你现在处于最深层,否则将深度增加1,将nextLayer复制到currentLayer,然后重新执行。