本题如果用recursive方法,会非常简单。其实用iterative方法,也不算非常难,难点在于:
- 如何避免在
stack里面push重复的TreeNode
大概步骤:
- 先把左子树(包括自己)的全部
TreeNode都push到stack中 - 一个一个
pop - 如果
pop的存在右子树,则把这个右子树的左子树(包括自己)全部push进stack中
其实叙述是叙述不明白的,代码很好懂:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();Stack<TreeNode> stack = new Stack<>();pushAllLeft(root, stack);while (!stack.isEmpty()) {TreeNode node = stack.pop();result.add(node.val);pushAllLeft(node.right, stack);}return result;}private void pushAllLeft(TreeNode node, Stack<TreeNode> stack) {while (node != null) {stack.push(node);node = node.left;}}}
