(FB) 从 Binary Tree Path 看如何递归转迭代
例题:给定 Binary Tree,print 所有 root - leaf 的 path.
A
/ \
B D
/ / \
C E F递归:
public static void printPaths_recursion(TreeNode root){
dfs(root, new ArrayList<>());
}
private static void dfs(TreeNode root, List<TreeNode> list){
if(root == null) return;
list.add(root);
if(root.left == null && root.right == null){
for(TreeNode node : list) System.out.print(node.val + ",");
System.out.println();
list.remove(list.size() - 1);
return;
}
dfs(root.left, list);
dfs(root.right, list);
list.remove(list.size() - 1);
}迭代解法 1:
迭代解法 2:
迭代解法 3: Stack + 自定义 StackFrame
这样代码如下,每次 stack 里存的,都是当前路径 (配合一个 List 做高效 print path 操作),而每次栈顶的 StackFrame 都记录了当前 node 的访问状态和下一步的动向。
这种 0/1/2 的状态表示方式看着有点像 Graph 里面做 DFS / BFS 的标注,其实不完全一样,只是在这题我们的树一定是二叉而已。
对于多叉树的情况,改动也不会很难;这次 index 代表着 “下一个要访问的 child index”,当 index == children.size() 的时候,我们就可以知道当前 node 的所有子节点都访问完了。
Last updated