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

1 2
| 输入:root = [1,null,2,3] 输出:[1,3,2]
|
示例 2:
示例 3:
提示:
- 树中节点数目在范围
[0, 100]
内
-100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
递归写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); mid(root, list); return list; }
private void mid(TreeNode root, List list) { if (root != null) { mid(root.left, list); list.add(root.val); mid(root.right, list); } } }
|
迭代写法
递归的写法是不断往左走,左边走不下去了,就打印当前节点,并转向右边,然后右边继续这个过程。
转化成非递归写法就是用栈模拟系统栈,一直将左孩子入栈,如果没有左孩子了,就打印也就是出栈,然后转向右孩子。
如果栈不空并且root
不为null
一直循环:
- 如果
root
不为空,将root
入栈,root
指向左孩子
- 如果
root
为空,栈顶出栈,栈顶右孩子入栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left; } root = stack.pop(); list.add(root.val); root = root.right; } return list; } }
|