本题如果用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;
}
}
}