Iterative Tree Traversal
8/3/26Less than 1 minute
Iterative Tree Traversal
非递归遍历把调用栈显式化,适合树很深、需要暂停恢复遍历,或要精确控制访问状态的场景。
Preorder
栈中保存待访问节点;先压右子树、再压左子树,保证左侧先出栈。
Inorder
不断把左链压栈;弹出一个节点并访问,再转向其右子树。循环条件必须是 cur != null || !stack.isEmpty()。
List<Integer> inorder(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
ans.add(cur.val);
cur = cur.right;
}
return ans;
}Postorder
常见写法有两种:根—右—左遍历后反转,或用 lastVisited 判断右子树是否已经处理。第二种只用一个栈,但状态更容易写错。
显式栈与递归的渐进空间相同,都是 ;它的优势是控制权,而不是自动降低空间。
