Given a binary tree, return the inorder traversal of its nodes’ values.

    Example:

    1. Input: [1,null,2,3]
    2. 1
    3. \
    4. 2
    5. /
    6. 3
    7. Output: [1,3,2]

    Follow up: Recursive solution is trivial, could you do it iteratively?


    题意

    求树的中序遍历。

    思路

    递归或者迭代。

    另有一种神奇的既不使用栈也不用递归的遍历方法,参考 Inorder Tree Traversal without recursion and without stack!。(官方解答改变了树的结构却没有恢复原状)


    代码实现 - 递归

    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> ans = new ArrayList<>();
    13. inorder(root, ans);
    14. return ans;
    15. }
    16. private void inorder(TreeNode x, List<Integer> ans) {
    17. if (x == null) {
    18. return;
    19. }
    20. inorder(x.left, ans);
    21. ans.add(x.val);
    22. inorder(x.right, ans);
    23. }
    24. }

    代码实现 - 迭代

    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> ans = new ArrayList<>();
    13. Deque<TreeNode> stack = new ArrayDeque<>();
    14. TreeNode cur = root;
    15. while (cur != null || !stack.isEmpty()) {
    16. while (cur != null) {
    17. stack.push(cur);
    18. cur = cur.left;
    19. }
    20. cur = stack.pop();
    21. ans.add(cur.val);
    22. cur = cur.right;
    23. }
    24. return ans;
    25. }
    26. }

    代码实现 - O(1)空间迭代

    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> ans = new ArrayList<>();
    13. TreeNode cur = root;
    14. while (cur != null) {
    15. if (cur.left != null) {
    16. TreeNode r = cur.left;
    17. while (r.right != null && r.right != cur) {
    18. r = r.right;
    19. }
    20. if (r.right == null) {
    21. r.right = cur;
    22. cur = cur.left;
    23. } else {
    24. r.right = null;
    25. ans.add(cur.val);
    26. cur = cur.right;
    27. }
    28. } else {
    29. ans.add(cur.val);
    30. cur = cur.right;
    31. }
    32. }
    33. return ans;
    34. }
    35. }