• 力扣 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)

  • 相关阅读:
    (七)linux 学习 -- 键盘高级操作技巧
    (六)linux 学习 -- 从 shell 眼中看世界
    (五)linux 学习 --重定向
    (四)linux 学习 --使用命令
    (三)linux 学习 --操作文件和目录
    JavaScript封装好的方法
    覆盖Html5默认样式
    CSS的布局整理
    Vue学习笔记
    博客园添加和隐藏导航菜单
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/12952971.html
Copyright © 2020-2023  润新知