首页 > 其他分享 >LC 104.二叉树的最大深度

LC 104.二叉树的最大深度

时间:2024-03-30 12:59:09浏览次数:26  
标签:node LC 递归 int 二叉树 root 节点 104

104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: 3

示例 2:

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

提示:

  • 树中节点的数量在 [ 0 , 1 0 4 ] [0, 10^4] [0,104] 区间内。
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \leq Node.val \leq 100 −100≤Node.val≤100

解法一(BFS+队列)

思路分析:

  1. 使用层序遍历对二叉树进行遍历,在遍历二叉树的过程中,记录遍历的层数

实现代码如下:

class Solution {
    public int maxDepth(TreeNode root) {
        int ans = 0;
        if (root == null)
            return ans;        // 边界条件
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            ++ ans;        // 记录层数
            for (int i = 0; i < size; ++ i) {
                TreeNode node = queue.poll();
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
        }
        return ans;
    }
}

提交结果如下:

解答成功:
执行耗时:1 ms,击败了22.08% 的Java用户
内存消耗:41.6 MB,击败了8.86% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n)

解法二(前序求深度+递归)

思路分析:

  1. 根据dfs递归遍历二叉树,并在遍历的过程标记某二叉树的节点所在层数

  2. 即递归参数主要有两个,一个是二叉树结点,另一个是该节点所在层数

  3. 递归边界条件,即为结点为空时,不再往下遍历

  4. 递归过程,即比较该层是否为最大深度即可

实现代码如下:

class Solution {
    int ans = 0;
    public int maxDepth(TreeNode root) {
        getMaxDepth(root, 1);
        return ans;
    }
    private void getMaxDepth(TreeNode node, int depth) {
        if (node == null)
            return ;
        ans = Math.max(ans, depth);
        getMaxDepth(node.left, depth+1);
        getMaxDepth(node.right, depth+1);
    }
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:41.3 MB,击败了16.72% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),考虑递归对栈的消耗

解法三(后序求高度+递归)

思路分析:

  1. 对于该题,首先注意一个细节,对于该题求根节点的高度即等同于求根节点的最大深度

  2. 所以,可以使用 后序遍历求二叉树的最大高度,即根节点的高度来得到二叉树的最大深度。

  3. 然后思考递归的参数和返回值;对于该题递归的参数只有二叉树的节点,返回值即为该节点的高度

  4. 然后思考递归的边界条件;即当该节点为null时,此时节点高度为0,返回即可

  5. 对于递归的过程,则先求左右孩子节点的高度,然后得出最大值,再加一,则得出该节点的高度,返回即可。

实现代码如下:

class Solution {
    public int maxDepth(TreeNode root) {
        return getHeight(root);
    }
    // 后序遍历求二叉树某节点的高度
    private int getHeight(TreeNode node) {
        if (node == null)
            return 0;    // 为空时 节点高度为0
        // 左
        int leftHeight = getHeight(node.left);
        // 右
        int rightHeight = getHeight(node.right);
        // 中
        int height = Math.max(leftHeight, rightHeight) + 1;
        return height;        // 返回该节点高度
    }
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:41.3 MB,击败了18.91% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),考虑递归的空间消耗

标签:node,LC,递归,int,二叉树,root,节点,104
From: https://blog.csdn.net/qq_61457746/article/details/137170677

相关文章

  • 干货分享│金属板材成形极限FLC测量流程介绍(XTDIC-FLC;三维全场应变测量)
    板料成形是一种材料加工技术,在航空、航天、船舶、汽车等行业领域被广泛应用。板料的成形极限,是衡量板料塑性成形性能的重要指标。以极限应变构成的成形极限图(FLD),常被用于板料受到拉伸、胀形或拉伸胀形结合时能够达到的变形程度,为评价板料成形性能以及改进成形工艺提供技术基础......
  • 【洛谷】P1049 装箱问题
    P1049装箱问题确认所需算法题目链接:P1049装箱问题通过看标签得知这题是一道背包问题,如果你还不知道什么是背包问题,那么请看我这篇文章既然我们知道了这道题是一道背包问题,那么下一步我们要确认他是01背包还是完全背包。首先我们回顾01背包和完全背包的区别:通过题意可知,每......
  • 【数据结构】树与二叉树
    树与二叉树目录树与二叉树树二叉树二叉树的定义二叉树的性质二叉树--存储结构二叉树的顺序存储表示二叉树的链式存储表示二叉链表三叉链表双亲数组遍历二叉树先(根)序的遍历算法中(根)序的遍历算法后(根)序的遍历算法遍历二叉树——相关结论应用二叉树存放表达式求二叉树的......
  • 最近公共祖先 (Lowest Common Ancestor)LCA
    最近公共祖先原文链接c++代码#include<bits/stdc++.h>usingnamespacestd;constexprintN=5E5+10;structedge{intto,next;//两个整型成员变量to和next。这个结构体表示了图中的一条边,其中to表示边的终点,//next表示下一条......
  • 代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为
    文章目录669.修剪二叉搜索树解题思路源码108.将有序数组转换为二叉搜索树解题思路源码538.把二叉搜索树转换为累加树解题思路源码669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值......
  • VKL144A/B TSSOP48/QFP48L-点阵式液晶驱动芯片/低电流LCD驱动,36×4段技术支持
    产品品牌:永嘉微电/VINKA产品型号:VKL144A/B封装形式:TSSOP48/QFN48L概述:VKL144A/BTSSOP48/QFN48L是一个点阵式存储映射的LCD驱动器,可支持最大144点(36SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式......
  • 常见的PLC品牌
    常见的PLC品牌在工业自动化领域,可编程逻辑控制器(PLC)是不可或缺的重要设备。市场上存在众多PLC品牌,各自具有不同的特点和优势。本文将介绍常见的PLC品牌,包括西门子(Siemens)、施耐德(Schneider)、艾默生(Emerson)、欧姆龙(Omron)、三菱(Mitsubishi)、罗克韦尔(Rockwell)、霍尼韦尔(Honeyw......
  • systemd-journal(一)之journalctl命令详解
    文章目录写在前面概述描述不传递参数传递一个或多个匹配参数示例源选项用法--system,--user-M,--machine=-m,--merge-DDIR,--directory=DIR--file=GLOB--root=ROOT--image=IMAGE--image-policy=policy--namespace=NAMESPACE过滤选项用法-S,--since=,-U,--until......
  • PLC中的大端小端
    相信大家在阅读有关通讯数据传输、PLC数据存储等技术文档时,经常会碰到“Big-Endian”(大端对齐)与Little-Endian(小端对齐)术语。很多朋友不理解大端和小端模式,本文给大家写一下此知识点。一、大端与小端之分在PLC系统中,数据存储在以字节为单元的可寻址存储器中。这些数据......
  • Siemens 西门子 PLC Modbus写入float字节排列
    写保存寄存器功能码16示意:在西门子PLC中,实数,float,的保存方式遵循“高字节低地址,低字节高地址”的方式。假设使用16功能码向PLC的40005写入一个float,先利用BitConverter.GetBytes(f)得到要写的float的byte[]A。根据PLC中的存储方式,要想获得正确的float,在字40005的低......