• 力扣 94. 二叉树的中序遍历


    94. 二叉树的中序遍历

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

    示例:

    思路一:递归写法

    定义一个列表,加入左子树的所有结点值,加入根节点值,加入右子树的值

     1  // 递归写法
     2 class Solution {
     3     public List<Integer> inorderTraversal(TreeNode root) {
     4         List<Integer> list = new ArrayList<Integer>();
     5         if(root != null){
     6             list.addAll(inorderTraversal(root.left));
     7             list.add(root.val);
     8             list.addAll(inorderTraversal(root.right));
     9         }
    10         return list;
    11     }
    12 }

    力扣测试时间为:1ms, 空间为:38.5mb

    复杂度分析:

    时间复杂度为O(n)

    思路一的另一种写法:

    下面这种递归下方效率更高:

     1 class Solution {
     2     public List<Integer> inorderTraversal(TreeNode root) {
     3         List<Integer> res = new ArrayList<Integer>();
     4         if(root != null){
     5             helper(root, res);
     6         }
     7         return res;
     8     }
     9 
    10     public void helper(TreeNode root, List<Integer> res){
    11         if(root != null){
    12             helper(root.left, res);
    13             res.add(root.val);
    14             helper(root.right, res);
    15         }
    16     }
    17 }

    力扣测试时间为:0ms, 空间为38.3mb

    复杂度分析:

    时间复杂度为O(n)

    空间复杂度为O(n),每个结点的结点值都加入了列表一次,如果忽略这个的话,那么栈的递归层次最大为O(n), 平均为O(logn)

    思路二:迭代写法

     1 // 迭代写法
     2 class Solution {
     3     public List<Integer> inorderTraversal(TreeNode root) {
     4         List<Integer> list = new ArrayList<Integer>();
     5        // 借助一个栈
     6        Stack<TreeNode> stack = new Stack<>();
     7        TreeNode top = root;
     8        while(!stack.isEmpty() || top != null){
     9             // 碰到一个结点就不停的向左移动
    10             while(top != null){
    11                 stack.push(top);
    12                 top = top.left;
    13             }
    14             top = stack.pop();
    15             // 访问这个结点
    16             list.add(top.val);
    17 
    18             // 指向右结点
    19             top = top.right;
    20        }
    21        return list;
    22     }
    23 }

    力扣测试时间为1ms,空间为38mb

    复杂度分析:

    时间复杂度为:将每个结点都访问了一遍,并且都入栈了一次,所以时间复杂度为O(n)

    空间复杂度:空间的主要取决于栈的大小,栈的大小就是树的高度,所以最坏情况下空间复杂度为O(n), 最好情况下为O(logn)

  • 相关阅读:
    Java流关闭总结
    Too many open files 问题
    oracle数据库表被锁的解锁方法
    中文转换成字节数组
    java接口理解
    最小的K个数
    数组中出现次数超过一半的数字
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12952971.html
Copyright © 2020-2023  润新知