题目与示例

  1. 94. 二叉树的中序遍历
  2. 给定一个二叉树的根节点 root ,返回它的 中序 遍历。
  1. 示例 1
  2. 输入:root = [1,null,2,3]
  3. 输出:[1,3,2]
  4. 示例 2
  5. 输入:root = []
  6. 输出:[]
  7. 示例 3
  8. 输入:root = [1]
  9. 输出:[1]
  10. 示例 4
  11. 输入:root = [1,2]
  12. 输出:[2,1]
  13. 示例 5
  14. 输入:root = [1,null,2]
  15. 输出:[1,2]

代码

非递归

image.png
第一步:
(1)s.addFirst(p);
(2)A.left不为空,把节点B放入栈中;
(3)B.left不为空,把节点D放入一栈中;
image.png
第二步:
(1)D.left为空,跳出里层的while循环,输出“D”;
image.png
第三步:
(1)D.right为空,跳出里层的while循环,输出B;
image.png
第四步:
(1)B.right访问到E,E进入栈内;
image.png
第五步:
(1)B.right访问到E,E进入栈内;
(2)E.left为空,跳出里层的while循环,输出“E”;
image.png
第六步:
(1)E.right为空,跳出里层的while循环,输出“A”;

第六步:
(1)A.right访问到C,C进入栈;
image.png
第六步:
(1)C.left访问到F,F进入栈;
image.png
第六步:
(1)F.left为空,跳出里层的while循环,输出“F”;
image.png
第七步:
(1)F.right为空,跳出里层的while循环,输出“C”;
image.png
第八步:
(1)C.right不为空,访问到G,G进入栈;
image.png
第九步:
(1)G.left为空,跳出里层的while循环,输出G;
(2)G.right为空,跳出里层的while循环,判断栈为空,结束;

image.png

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<Integer> inorderTraversal(TreeNode root) {
  18. Stack<TreeNode> stack = new Stack<>();
  19. List<Integer> myList = new ArrayList();
  20. // 使用指针 记录遍历到哪个节点
  21. TreeNode p = root;
  22. while (p != null || !stack.isEmpty()) {
  23. // 入栈 把当前能读到的所有左孩子 存入栈中
  24. while (p != null) {
  25. stack.push(p);
  26. p = p.left;
  27. }
  28. if (!stack.isEmpty()) {
  29. p = stack.pop();
  30. myList.add(p.val);
  31. p = p.right;
  32. }
  33. }
  34. return myList;
  35. }
  36. }

递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        ArrayList<Integer> myList = new ArrayList();
        inOrder(root, myList);
        return myList;
    }
    void inOrder(TreeNode node, ArrayList<Integer> myList) {
         if (node == null) {
            return;
        }             
        inOrder(node.left,myList);
        myList.add(node.val);
        inOrder(node.right,myList);
     }
}