94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]
思路和144 二叉树的前序遍历(迭代遍历)一致,但区别在于我们不是 遇见一个就将这个节点的值加入数组中,而是在这个节点出栈的时候,再将其节点加入数组。
很容易想到:什么情况下节点会出栈?
- 叶子节点a出栈:左节点为null,退回a,a出栈。
- 非叶子节点b出栈:b的左子树已经遍历完成,退回b,然后继续遍历b的右子树。
可以看到,某个节点出栈的情况正是其左节点已经遍历完成,也就是左->中->右的左已经结束,这个时候将此节点的值加入数组中,正好对应着中序遍历的顺序。
举例说明:

此时当前节点为null,1节点出栈,将其值加入数组。

进入1节点的右子树,将2节点压栈

递归遍历其左子树直至为null,每个节点都压入栈中

当前指针指向null,需要退回父节点,并将父节点的值加入队列

进入3节点的右节点,还是null

此时走到了2节点的右节点,为null,且栈中无可出栈元素,遍历结束。

代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null){return res;}
Deque<TreeNode> stack = new ArrayDeque<TreeNode>();
TreeNode now = root;
while(now != null || !stack.isEmpty()){
while(now != null){
stack.push(now);
now = now.left;
}
now = stack.pop();
res.add(now.val);
now = now.right;
}
return res;
}
}
注意:
- Stack.push()和now=now.left的顺序一定benign写反,先入栈在递归。
- 循环终止条件依然是:指针now为null,且无路可退(栈中无可出栈元素)
- 节点出栈的时候将值加入属猪中
- 注意边界条件(root == null)
这篇博客详细介绍了如何使用迭代方法实现二叉树的中序遍历。通过建立一个栈来辅助遍历,当左子树为空时,节点出栈并将其值添加到结果数组中,遵循中序遍历的左-中-右顺序。在遍历过程中,不断将当前节点压栈并遍历其左子树,直到遇到叶子节点,然后回溯并处理右子树,直至遍历结束。这种方法与前序遍历类似,但出栈时机不同,确保了正确的遍历顺序。
283

被折叠的 条评论
为什么被折叠?



