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)