二叉树的前序遍历(Preorder Traversal)问题是先访问根节点,然后前序遍历左子树,最后前序遍历右子树。
我们可以使用栈实现二叉树的前序遍历非递归算法:
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) return result;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode curr = stack.pop();
result.add(curr.val);
if (curr.right != null) stack.push(curr.right);
if (curr.left != null) stack.push(curr.left);
}
return result;
}
算法流程:
- 定义result存储结果,stack用于前序遍历。
- 根节点入栈。
- 当栈非空时循环。出栈当前节点curr,将值加入result。
- 右子节点先入栈,左子节点后入栈。(右左中)
- 重复步骤3和4,直到栈为空,返回result。
- 特殊情况,root为空,返回result。
时间复杂度O(n),空间复杂度O(n)。
所以,二叉树前序遍历的关键是:
- 使用栈模拟递归调用栈。
- 出栈根节点,访问根节点,将右子节点和左子节点依次入栈。
- 重复步骤2,直到栈为空,得到结果。
- 与递归前序遍历相比,只是使用栈代替了递归调用栈。