本题如果用recursive方法,会非常简单。其实用iterative方法,也不算非常难,难点在于:

    • 如何避免在stack里面push重复的TreeNode

    大概步骤:

    • 先把左子树(包括自己)的全部TreeNodepushstack
    • 一个一个pop
    • 如果pop的存在右子树,则把这个右子树的左子树(包括自己)全部pushstack

    其实叙述是叙述不明白的,代码很好懂:

    1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode(int x) { val = x; }
    8. * }
    9. */
    10. class Solution {
    11. public List<Integer> inorderTraversal(TreeNode root) {
    12. List<Integer> result = new ArrayList<>();
    13. Stack<TreeNode> stack = new Stack<>();
    14. pushAllLeft(root, stack);
    15. while (!stack.isEmpty()) {
    16. TreeNode node = stack.pop();
    17. result.add(node.val);
    18. pushAllLeft(node.right, stack);
    19. }
    20. return result;
    21. }
    22. private void pushAllLeft(TreeNode node, Stack<TreeNode> stack) {
    23. while (node != null) {
    24. stack.push(node);
    25. node = node.left;
    26. }
    27. }
    28. }