当前位置: 首页 > article >正文

LeetCode算法题(Go语言实现)_33

题目

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

一、代码实现

func maxDepth(root *TreeNode) int {// 递归法(后序遍历)if root == nil {return 0}leftDepth := maxDepth(root.Left)rightDepth := maxDepth(root.Right)return max(leftDepth, rightDepth) + 1
}// 层序遍历法(BFS)
func maxDepthBFS(root *TreeNode) int {if root == nil {return 0}queue := []*TreeNode{root}depth := 0for len(queue) > 0 {levelSize := len(queue)for i := 0; i < levelSize; i++ {node := queue[0]queue = queue[1:]if node.Left != nil {queue = append(queue, node.Left)}if node.Right != nil {queue = append(queue, node.Right)}}depth++}return depth
}

二、算法分析

1. 核心思路
  • 递归分治:将问题分解为左右子树的最大深度计算,最终合并结果
  • 层序遍历:通过队列逐层扫描节点,统计层数即为最大深度
  • 数学公式maxDepth(root) = max(maxDepth(left), maxDepth(right)) + 1
2. 关键步骤
  1. 递归终止条件:节点为nil时返回深度0
  2. 递归分解:分别计算左右子树深度
  3. 合并结果:取子树深度最大值加1
  4. BFS队列处理:每次处理完一层节点后深度+1
3. 复杂度
方法时间复杂度空间复杂度适用场景
递归法O(n)O(h),h为树高度树平衡时效率高
层序遍历法O(n)O(n),最坏情况避免递归栈溢出

三、图解示例

以二叉树[3,9,20,null,null,15,7]为例:

    3/ \9  20/  \15   7

递归过程

  1. 节点3深度 = max(节点9深度1,节点20深度2) +1 → 3
  2. 节点20深度 = max(节点15深度1,节点7深度1) +1 → 2

层序遍历过程

  1. 第1层:3 → depth=1
  2. 第2层:9,20 → depth=2
  3. 第3层:15,7 → depth=3

四、边界条件与扩展

1. 特殊场景验证
  • 空树:返回0
  • 单节点树:返回1
  • 左斜树:深度等于节点数(如链表结构)
  • 满二叉树:深度为log₂(n+1)
2. 多语言实现
# Python递归实现
class Solution:def maxDepth(self, root: Optional[TreeNode]) -> int:if not root: return 0return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1# Python层序遍历
from collections import deque
def maxDepthBFS(root):if not root: return 0q = deque([root])depth = 0while q:depth += 1for _ in range(len(q)):node = q.popleft()if node.left: q.append(node.left)if node.right: q.append(node.right)return depth
// Java递归实现
class Solution {public int maxDepth(TreeNode root) {if(root == null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;}
}// Java层序遍历
class Solution {public int maxDepthBFS(TreeNode root) {if(root == null) return 0;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while(!queue.isEmpty()){depth++;int size = queue.size();while(size-- > 0){TreeNode node = queue.poll();if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);}}return depth;}
}

五、总结与扩展

1. 核心创新点
  • 分治思想:将复杂问题分解为可重复解决的子问题
  • 空间优化:递归法空间复杂度仅与树高相关
  • 遍历统一:层序遍历框架可扩展用于求平均值、右视图等问题
2. 扩展应用
  • 最小深度:修改递归终止条件
  • 平衡判断:结合深度计算判断子树高度差
  • 序列化二叉树:结合层序遍历实现
  • N叉树深度:递归时遍历所有子节点取最大值
3. 工程优化方向
  • 尾递归优化:改造递归为尾递归形式避免栈溢出
  • 迭代器模式:实现层次遍历迭代器减少内存消耗
  • 并行计算:对左右子树深度计算进行多线程优化

相关文章:

LeetCode算法题(Go语言实现)_33

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 一、代码实现 func maxDepth(root *TreeNode) int {// 递归法&#xff08;后序遍历&#xff09;if root nil {return 0}leftDepth : maxDepth(r…...

go程序启动工具——cobra

以下是将“为什么很多 Go 程序启动都是用 Cobra”的内容转换为 Markdown 格式的文档&#xff1a; 为什么很多 Go 程序启动都是用 Cobra 在 Go 编程生态中&#xff0c;Cobra 是一个非常流行的命令行工具库&#xff0c;许多 Go 程序选择使用它来构建启动逻辑和命令行接口&#…...

Unet网络的Pytorch实现和matlab实现

文章目录 一、Unet网络简介1.1 输入图像1.2 编码器部分&#xff08;Contracting Path&#xff09;1.3 解码器部分&#xff08;Expanding Path&#xff09;1.4 最后一层&#xff08;输出&#xff09;1.5 跳跃连接&#xff08;Skip Connections&#xff09; 二、Unet网络的Pytorc…...

【合新通信】相控阵雷达RFoF方案的应用

一、相控阵雷达为何需要RFoF&#xff1f; 核心需求驱动 分布式部署&#xff1a;相控阵雷达&#xff08;AESA/PESA&#xff09;的T/R模块需分散布局&#xff08;如舰载雷达阵面、卫星载荷&#xff09;&#xff0c;传统同轴电缆导致重量和损耗剧增。高频段挑战&#xff1a;X/Ku/…...

关于点卷积

&#x1f9e0; 什么是点卷积&#xff1f; 点卷积&#xff08;Pointwise Convolution&#xff09; 是一种特殊类型的卷积操作&#xff0c;其基本特点是卷积核的大小为 1 1 1 \times 1 11。与传统的卷积操作&#xff08;如 3 3 3 \times 3 33 或 5 5 5 \times 5 55 卷积核…...

原理图输出网表及调入

一、输出网表操作步骤 &#xff08;1&#xff09;选中.dsn文件&#xff0c;选者N或进入tools下拉列表选择Creat Netlists &#xff08;2&#xff09;导出网表后的文件 二、网表的导入 &#xff08;1&#xff09;执行菜单命令“File-Import-Logic/netlist”&#xff0c;将原理…...

python基础12 模块/库的引用

在软件的设计中&#xff0c;经常提及到解耦的概念&#xff0c;即模块和模块之间的功能尽可能独立&#xff0c;减少不必要的关联。所以在实际项目中&#xff0c;我们经常会将一个工程拆解成很多不同的功能模块&#xff0c;以实现更优的设计并满足团队开发的要求。 有了模块的概…...

TDengine JAVA 语言连接器

简介 本节简介 TDengine 最重要且使用最多的连接器, 本节内容是以教科书式方式列出对外提供的接口及功能及使用过程中要注意的技术细节&#xff0c;大家可以收藏起来做为今后开发 TDengine 的参考资料。 taos-jdbcdriver 是 TDengine 的官方 Java 语言连接器&#xff0c;Java…...

【NLP 55、实践 ⑬ LoRA完成NER任务】

目录 一、数据文件 二、模型配置文件 config.py 三、数据加载文件 loader.py 1.导入文件和类的定义 2.初始化 3.数据加载方法 代码运行流程 4.文本编码 / 解码方法    ① encode_sentence()&#xff1a; ② decode()&#xff1a; 代码运行流程 ③ padding()&#xff1a; 代码…...

【蓝桥杯】Python大学A组第十五届省赛

1.填空题 1.1.拼正方形 问题描述 小蓝正在玩拼图游戏,他有个的方块和个的方块,他需要从中挑出一些来拼出一个正方形。 比如用个和个的方块可以拼出一个的正方形;用个的方块可以拼出一个的正方形。 请问小蓝能拼成的最大的正方形的边长为多少。 import math # 2*2的个数 a =…...

小球反弹(蓝桥杯C语言)

有一长方形&#xff0c;长为 343720343720 单位长度&#xff0c;宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积)&#xff0c;其初速度如图所示且保持运动速率不变&#xff0c;分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰到长方形的…...

Redis底层数据结构?编码与底层数据结构的映射?

Redis底层数据结构 一、简单动态字符串&#xff08;SDS&#xff09; 结构&#xff1a; struct sdshdr {int len; // 已使用字节长度 int free; // 未使用字节长度 char buf[]; // 字节数组&#xff08;兼容C字符串&#xff09; };特点&#xff1a; 二进制安全&#…...

linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407

linux环境下的硬盘分区格式化工具介绍 fdisk,gdisk,parted,cfdisk,cgdisk,sfdisk,gparted 笔记250407 以下是 Linux 系统中常用的 硬盘分区与格式化工具&#xff0c;涵盖命令行和图形界面工具&#xff0c;按功能分类整理&#xff1a; 一、分区管理工具 1. 命令行工具 工具功能…...

HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context

UIAbility及相关类关系 一个模块编译的时候会出一个HAP包&#xff0c; 每一个HAP包在运行时都对应一个AbilityStage。 AbilityStage持有一个AbilityStageContext一个APP&#xff0c; 有时候会有很多个HAP包&#xff0c; 至少一个。 一个APP运行时&#xff0c;对应的是我们的App…...

前端入门之CSS

CSS: HTML负责定义页面结构;JS负责处理页面逻辑和点击事件;CSS负责用于描述 HTML 元素的显示方式,通过 CSS 可以控制颜色、字体、布局等。 核心语法: 选择器: 类选择器主要用于选中需要添加样式的 HTML 元素。主要分为:类选择器(.class-name { ... })、标签选择器(…...

JavaScript逆向WebSocket协议解析与动态数据抓取

在JavaScript逆向工程中&#xff0c;WebSocket协议的解析和动态数据抓取是关键技能。本文将结合Fiddler、Charles Proxy和APIfox工具&#xff0c;详细讲解如何解析WebSocket协议并抓取动态数据。 一、WebSocket协议解析 &#xff08;一&#xff09;WebSocket协议的基本概念 …...

剑指Offer(数据结构与算法面试题精讲)C++版——day4

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day4 题目一&#xff1a;和为k的子数组题目二&#xff1a;0和1个数相同的子数组题目三&#xff1a;左右两边子数组的和相等 题目一&#xff1a;和为k的子数组 结合前面着重阐述的双指针法这一经典的算法技巧&…...

从代码学习深度学习 - NLP之文本预处理 PyTorch版

文章目录 前言1. 文本预处理理论知识1.1 文本清洗与标准化1.2 分词(Tokenization)1.3 词频统计与词汇表构建1.4 序列表示与批次生成1.5 预处理的意义2. 文本预处理的核心代码解析2.1 读取数据集:`read_time_machine`2.2 分词处理:`tokenize`2.3 词频统计:`count_corpus`2.…...

WebRTC技术简介及应用场景

写在前面 本文是参考稀土掘金的文章,整理得出,版权归原作者所有!参考链接请点击跳转 WebRTC&#xff08;Web Real-Time Communication&#xff09; 是一项开源技术&#xff0c;允许浏览器和移动应用直接进行实时音视频通信和数据传输&#xff0c;无需安装插件或第三方软件。它…...

介绍几种创意登录页(含完整源码)

今天为大家收集了几种不同风格的登录页&#xff0c;搭配动态渐变背景&#xff0c;效果绝对惊艳&#xff01; CSS3实现动态渐变玻璃拟态登录页 一、开篇语 纯CSS实现当下最火的玻璃拟态(Morphism)风格登录页&#xff0c;搭配动态渐变背景&#xff0c;效果绝对惊艳&#xff01; …...

git分布式控制工具详解

1. 版本控制器的方式 1.1 集中式版本控制工具 特点&#xff1a; 版本库集中存放在中央服务器必须联网才能工作&#xff08;局域网/互联网&#xff09;个人修改后提交到中央版本库 举例&#xff1a;SVN、CVS 1.2 分布式版本控制工具 特点&#xff1a; 无"中央服务器&qu…...

Uni-app入门到精通:uni-app的基础组件

1、view view是容器组件&#xff0c;类似于HTML中的<div></div>标签&#xff0c;用于包裹各种元素内容&#xff0c;是页面布局常用的组件。view组件的属性如下 属性类型默认值说明hover-classStringnone指定按下去的样式类。当hover-class"none"时&…...

R语言从专家到小白

文章目录 下载安装R下载安装R StudioCRAN 下载安装R Index of /bin https://cran.r-project.org/ 下载安装R Studio https://posit.co/download/rstudio-desktop/ CRAN R综合档案网络。 CRAN 镜像是一个提供 R 语言软件和包的在线服务&#xff0c;用户可以从不同的地区选择…...

显示器工艺简介

华星光电显示器的生产工艺流程介绍&#xff0c;从入厂原料到生产出显示器的整体工艺介绍 华星光电显示器的生产工艺流程主要包括以下几个阶段&#xff0c;从原材料入厂到最终显示器的生产&#xff1a; 原材料准备 玻璃基板&#xff1a;显示器的核心材料&#xff0c;通常采用超…...

大文件上传源码,支持单个大文件与多个大文件

大文件上传源码&#xff0c;支持单个大文件与多个大文件 Ⅰ 思路Ⅱ 具体代码前端--单个大文件前端--多个大文件前端接口后端 Ⅰ 思路 具体思路请参考我之前的文章&#xff0c;这里分享的是上传流程与源码 https://blog.csdn.net/sugerfle/article/details/130829022 Ⅱ 具体代码…...

C语言--插入排序

插入排序&#xff1a;简单而高效的排序算法 在计算机科学中&#xff0c;排序是一种常见的操作&#xff0c;用于将一组数据按照特定的顺序排列。插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的工作原理类似于我们整理扑克牌的过程。…...

L2-024 部落 #GPLT,并查集 C++

文章目录 题目解读输入格式输出格式 思路Ac Code参考 题目解读 我们认为朋友的朋友都算在一个部落里&#xff0c;于是要请你统计一下&#xff0c;在一个给定社区中&#xff0c;到底有多少个互不相交的部落&#xff1f;并且检查任意两个人是否属于同一个部落。 输入格式 第一…...

前端面试题(三):axios有哪些常用的方法

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 中发送 HTTP 请求。它提供了一些常用的方法来处理不同类型的请求。以下是 Axios 中常用的一些方法&#xff1a; 1. axios.get() 用于发送 GET 请求&#xff0c;从服务器获取数据。 axios.get(/api/d…...

JSON 基础知识(一)

第一部分&#xff1a;JSON 基础知识 &#x1f4e2; 快速掌握 JSON&#xff01;文章 视频双管齐下 &#x1f680; 如果你觉得阅读文章太慢&#xff0c;或者更喜欢 边看边学 的方式&#xff0c;不妨直接观看我录制的 JSON 课程视频&#xff01;&#x1f3ac; 视频里会用更直观…...

SSM框架学习(Day-1)

1.spring系统架构 自底而上进行,上层依赖于下层,首先最底层是Core Container -- 核心容器, 再往上是AOP(面向切面编程)和Aspects(AOP)思想的实现, 我个人的理解是, 它可以在不惊动你原始程序的基础上, 给它增强功能&#xff0c;类似于反射&#xff1b;再往上是数据访问层。 C…...