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