LeetCode题解No94——“二叉树的中序遍历”

LeetCode题解

No94

难度:Middle

题目描述:

/*
给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]
   1
    \
     2
    /
   3

输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

题目思路

   看到二叉树遍历的题目,第一个思路就是对其进行递归即可,只需要注意其遍历的一个顺序,中序:左根右,前序:左右根,后序:根左右。递归的代码很好写,一看就能明白。题目也提到了尝试要用迭代的方法去做一遍,最开始其实是没什么思路,后面看了官方题解恍然大悟,维护一个栈即可。首先先把最左边的节点遍历,然后进行回溯上一个根节点,最后再判断是否有右节点即可。详细的看代码,也是比较容易理解的

代码执行

// 用一个List存放答案
   List<Integer> ans = new ArrayList<>();
   // 递归的方法
   public List<Integer> inorderTraversal(TreeNode root) {
       // 特判
       if (root == null){
           return ans;
       }

       // 根据左右根的方法递归
       if (root.left!=null){
           inorderTraversal(root.left);
       }
       // 如果当前节点不为空,加入ans里
       if (root!=null){
           ans.add(root.val);
       }
       if (root.right!=null){
           inorderTraversal(root.right);
       }
       return ans;
   }

   // 迭代的方法
   public List<Integer> inorderTraversal2(TreeNode root){
       // 迭代的关键是维护栈
       // 存放答案的List
       List<Integer> list = new ArrayList<>();
       Deque<TreeNode> stack = new LinkedList<>();

       // 特判
       if (root == null){
           return list;
       }

       //开始递归,循环条件——root不为空或者栈不为空即可
       while (root != null || !stack.isEmpty()){
           // 由中序遍历顺序可知,先把所有的左节点加入栈中,没有时再出栈
           while (root!=null){
               stack.push(root);
               root = root.left;
           }

           // 当走到最左边的节点的时候,将其出栈
           root = stack.pop();
           // 加入到结果集
           list.add(root.val);
           // 如果当前的root有右节点,令root为由节点,再回到循环体中的while去找当前子树的左节点
           root = root.right;
       }
       return list;
   }

纠错

1:递归没有进行特判,导致root == null时报错,一定要注意边界问题

执行结果

递归

迭代

posted @ 2020-09-14 10:27  Ivanpp  阅读(176)  评论(0编辑  收藏  举报