• 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时报错,一定要注意边界问题

    执行结果

    递归

    迭代

  • 相关阅读:
    IOS-多线程知识
    《shop》 --- 自定义工具类 分页功能
    navicat for mysql 显示中文乱码解决办法
    Linux -- 搭建php服务器环境小记
    在自己主机搭建svn服务器,在远程地址里搭建svn服务器
    $ThinkPhp学习,shop项目 小记
    php 个人博客 实战小记
    php:require 和 include 的区别 5.9日
    mysql的入门命令 ==留言本的思路==
    Access denied for user 'root'@'localhost' (using password: YES) 问题解决小记
  • 原文地址:https://www.cnblogs.com/mlz031702145/p/13665310.html
Copyright © 2020-2023  润新知