题目

给定一个二叉树的根节点 root ,返回它的 中序 遍历

示例

image.png
输入:root = [1,null,2,3]
输出:[1,3,2]

输入:root = []
输出:[]

输入:root = [1]
输出:[1]

image.png
输入:root = [1,2]
输出:[2,1]

image.png
输入:root = [1,null,2]
输出:[1,2]

解题思路——递归

  1. 中序遍历的逻辑是:中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树;
  2. 递归结束的标志是:当结点为空,结束递归
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Binary_Tree_Inorder_Traversal_94 {
  4. public class TreeNode {
  5. int val;
  6. TreeNode left;
  7. TreeNode right;
  8. TreeNode() {}
  9. TreeNode(int val) { this.val = val; }
  10. TreeNode(int val, TreeNode left, TreeNode right) {
  11. this.val = val;
  12. this.left = left;
  13. this.right = right;
  14. }
  15. }
  16. public List<Integer> inorderTraversal(TreeNode root) {
  17. List<Integer> res = new ArrayList<Integer>();
  18. centre(root,res);
  19. return res;
  20. }
  21. public void centre(TreeNode root, List<Integer> res){
  22. if(root == null){
  23. return;
  24. }
  25. centre(root.left,res);
  26. res.add(root.val);
  27. centre(root.right,res);
  28. }
  29. }

解题思路——迭代(栈)

  1. 中序遍历的逻辑是:中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树;
  2. 结点不为空或者栈不为空(要栈不为空原因是:到最底下的结点的左孩子,它为空,直接停止了遍历)的情况下遍历:当结点不为空,则进栈,然后遍历左孩子结点;当结点为空,则出栈,将结果保存到列表中,然后遍历右孩子结点。
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Binary_Tree_Inorder_Traversal_94 {

    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;
      }
    }

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Stack<TreeNode> sk = new Stack<TreeNode>();
        while(root != null || !sk.empty()){
            if (root != null){
                sk.push(root);
                root = root.left;
            }else{
                root = sk.pop();
                res.add(root.val);
                root = root.right;
            }
        }
        return res;
    }
}