题目描述
给定一个二叉树的根节点
root
,返回 它的 中序 遍历 。示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]示例 2:
输入:root = [] 输出:[]示例 3:
输入:root = [1] 输出:[1]提示:
- 树中节点数目在范围
[0, 100]
内-100 <= Node.val <= 100
给定一个二叉树的根节点
root
,返回 它的 中序 遍历 。示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]示例 2:
输入:root = [] 输出:[]示例 3:
输入:root = [1] 输出:[1]提示:
- 树中节点数目在范围
[0, 100]
内-100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
方法一 递归
思路:
很基础的,中序遍历指的是根节点在中间。左—根—右的顺序。
代码:
/*** 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<Integer>();zhongxu(root,res);return res;}public void zhongxu(TreeNode root,List<Integer> res){if(root ==null) return ;zhongxu(root.left,res);res.add(root.val);zhongxu(root.right,res);}
}
方法二 迭代
思路:
第一次学到这个迭代的思想,其实就是用了应该栈来模拟递归,又或者说递归其实隐式地用了一个栈。
先把左节点一个一个全部压入栈,直到没有左节点了。然后弹出栈顶(最左的节点),处理完了,把它的右节点压入栈。
代码:
/*** 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<Integer>();Deque<TreeNode> stk=new LinkedList<TreeNode>();while(root!=null||!stk.isEmpty()){while(root!=null){stk.push(root);root=root.left;}root=stk.pop();res.add(root.val);root=root.right;}return res;}
}
学到Java的栈,一般不用Stack,用Deque。因为Stack慢吧。
Deque可以当队列用,也可以当栈用。
队列:offer() poll() peek()
栈:push() poll()/pop() peek()
参考链接:94. 二叉树的中序遍历 - 力扣(LeetCode)