数据结构与算法之二叉树: LeetCode 104. 二叉树的最大深度 (Ts, Py, Go版)

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU) 为了解决CIoU的问题,有学者在CIOU的基础上将纵横比拆开,提出了EIOU Loss,并且加入Focal聚焦优质的预测框,与CIoU相似的,EIoU是损失函数的解决方案,只用于训练。在错误率小的地方,梯度的值也应当小,反之在错误率大的地方,梯度也应当大,因为这时候我们需要对错误率小的情况进行微调,而错误率大的地方进行大刀阔斧的调整;如下图所示,三种情况IoU都相等,但看得出来他们的重合度是不一样的,左边的图回归的效果最好,右边的最差。DIoU的作者考虑到,在两个框中心点重合时,c与d的值都不变。 阅读详情

二叉树的最大深度

  • https://leetcode.cn/problems/maximum-depth-of-binary-tree/

描述

  • 给定一个二叉树,找出其最大深度。

  • 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

  • 说明: 叶子节点是指没有子节点的节点。

示例

  • 给定二叉树 [3,9,20,null,null,15,7]

        3
       / \
      9  20
        /  \
       15   7
    
  • 返回它的最大深度 3

Typescript 算法实现


1 )方案 1

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function maxDepth(root: TreeNode | null): number {
    let dep = 0;
    // n是节点,l是层级
    const dfs = (n: TreeNode | null, l: number) => {
        if(!n) return;
        // console.log(n.val, l); // 访问当前节点
        (!n.left && !n.right) && (dep = Math.max(dep, l)); // 最大深度和较大层级的最大值, 当为叶子节点时,刷新最大深度
        dfs(n.left, l+1); // 访问左孩子节点
        dfs(n.right, l+1); // 访问右孩子节点
    }
    dfs(root, 1); // 执行
    return dep
};
  • 思路
    • 求树的最大深度,考虑使用深度优先遍历
    • 它是按顺序访问每个节点,但是不能拿到最大深度
    • 在深度优先遍历中,记录每个节点所在的层级,找出最大的层级即可
  • 步骤
    • 新建一个变量记录最大深度
    • 深度优先遍历整棵树,并记录每个节点的层级,同时不断刷新最大深度这个变量
    • 遍历结束返回最大深度这个变量

2 )方案 2

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function maxDepth(root: TreeNode | null): number {
    if (!root) return 0;
    return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
};
  • 上述是官方示例,及其简洁
  • 注意这个 1 表示当前节点,也是深度优先的递归实现

3 )方案 3

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function maxDepth(root: TreeNode | null): number {
    if (!root) return 0;
    let q = [root];
    let dep = 0
    while(q.length) {
        let len = q.length; // 当前队列长度
        while(len) {
            const n = q.shift(); // 拿到当前节点
            n.left && (q.push(n.left)) // 左节点进队
            n.right && (q.push(n.right)) // 右节点进队
            len --
        }
        dep ++
    }
    return dep;
}
  • 这是官方的C++解题示例,我改造的TS版本
  • 使用广度优先遍历实现
    • 此时广度优先搜索的队列里存放的是「当前层的所有节点」
    • 每次拓展下一层的时候,不同于广度优先搜索的每次只从队列里拿出一个节点
    • 需要将队列里的所有节点都拿出来进行拓展,这样能保证每次拓展完的时候
    • 队列里存放的是当前层的所有节点,即我们是一层一层地进行拓展
    • 最后我们用一个变量 dep 来维护拓展的次数
    • 该二叉树的最大深度即为 dep

Python3 版算法实现


1 )方案1 递归版(DFS)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        dep = 0

        def dfs(n: Optional[TreeNode], l: int):
            nonlocal dep
            if not n:
                return
            if not n.left and not n.right:
                dep = max(dep, l)
            dfs(n.left, l + 1)
            dfs(n.right, l + 1)

        dfs(root, 1)
        return dep

2 )方案2 递归法(简化版)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))

3 )方案3 迭代法(BFS)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        q: Deque[TreeNode] = deque([root])
        dep = 0

        while q:
            len_q = len(q)
            for _ in range(len_q):
                n = q.popleft()
                if n.left:
                    q.append(n.left)
                if n.right:
                    q.append(n.right)
            dep += 1

        return dep

Golang 版算法实现


1 )方案1 递归法(DFS)

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func maxDepth(root *TreeNode) int {
	var dep int
	dfs(root, 1, &dep)
	return dep
}

func dfs(n *TreeNode, l int, dep *int) {
	if n == nil {
		return
	}
	if n.Left == nil && n.Right == nil {
		*dep = max(*dep, l)
	}
	dfs(n.Left, l+1, dep)
	dfs(n.Right, l+1, dep)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

2 )方案2 递归版(简化版)

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func maxDepth(root *TreeNode) int {
	if root == nil {
		return 0
	}
	return 1 + max(maxDepth(root.Left), maxDepth(root.Right))
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

3 )方案3 迭代版(BFS)

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func maxDepth(root *TreeNode) int {
	if root == nil {
		return 0
	}
	q := []*TreeNode{root}
	dep := 0

	for len(q) > 0 {
		len := len(q)
		for len > 0 {
			n := q[0]
			q = q[1:]
			if n.Left != nil {
				q = append(q, n.Left)
			}
			if n.Right != nil {
				q = append(q, n.Right)
			}
			len--
		}
		dep++
	}

	return dep
}
AutoSAR配置与实践(实践篇)11.1 如何通过IPDU分组控制报文收发 注意这个新增的action其实是一个用户回调函数,在函数中进行配置字的判断,即可完成用户条件的判断(TRUE/FALSE),注意用户条件是用户封装的函数,用于输入给后续的逻辑判断和rule。进行PDU的拆分后,根据配置字可以选择PDU是否使能了。PDU组拆分后可分为常规PDU组和可配PDU组(新增),诊断一方面按原有逻辑控制常规PDU组,另一方面控制新的可配PDU组。举例说明,诊断场景:使能,配置字满足,则用户条件为TURE,表示期望使能可配PDU组(诊断禁止服务场景类似方式,在此不再列举)。 阅读详情

相关推荐

ST-CNN实战:用Python实现交通流量预测(附完整代码)

本文详细介绍了如何利用时空卷积神经网络(ST-CNN)进行交通流量预测的实战过程。通过Python和PyTorch,从数据预处理、构建邻接矩阵,到ST-CNN核心模块的代码实现与模型训练,提供了完整的解决方案,帮助开发者掌握处理时空序列数据的核心算法。

rust6ferris的博客 928

LeetCode-104. 二叉树的最大深度_JavaScript

给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 。 程序代码 /** * Definition for a binary tree node. * function TreeNode(val, left, right) { * ..

weixin_45344430的博客 621

U8 API接口开发踩过的坑

U8 API接口开发踩过的坑

haiyang5233233的专栏 1657

【LeetCode】-二叉树

文章目录前言一、二叉树的层序遍历 前言 初识LeetCode与算法,将在此系列文章里面,记录自己的算法学习经历,前期主要是监督自己学习打卡,后期我会将自己对知识的理解,慢慢补充到文章当中,希望大家能在阅读我的文章中,有所收获。该系列文章的刷题顺序以代码随想录为线索。 一、二叉树的层序遍历 题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[1

银尘博客 8117

如何在NVIDIA CX6 网卡和华为CE交换机上为RDMA协议使能DCQCN和PFC

【代码】如何在NVIDIA CX6 网卡和华为CE交换机上使能DCQCN和PFC。

Markchen7788的博客 5099

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 343

LeetCode二叉树问题全解析(中)

一、二叉树的修改与改造问题 1、翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 这道题目大家第一次做可能会觉得它很简单,左换右,一直递归不就行了 但如果沉下心来思考这道问题的本质 我相信大家一定有所收获! 之前我们介绍了各种遍历二叉树的方式,如果要翻转这颗二叉树 我们应该采取哪一种遍历方式呢? 其实这道题采用前,中,后都可以 只要在遍历时交换左右节点即可 但是中序的时候有些麻烦 因为 我们左子树的节点已经完成了翻转而此时左右交换,中序遍历恰好需要到右子树.

qq_59539549的博客 2195

Unreal Engine开发:角色动画与状态机_动画混合:通过混合节点实现平滑动画过渡

动画混合是提升游戏动画质量的关键技术之一。Unreal Engine提供了多种混合节点,包括BlendSpace1D、Blend Two By Bool、Blend Two By Alpha和Sequencer,每种节点适用于不同的场景。通过合理使用这些节点,可以实现平滑、自然且高效的动画过渡效果。此外,遵循最佳实践和高级应用技巧,可以进一步优化动画质量和性能。希望本节内容对你在Unreal Engine中实现动画混合有所帮助,使你的游戏角色动作更加流畅和自然。

chenlz2007的博客 1247

LeetCode题目——二叉树篇

LeetCode题目——二叉树篇前言一、二叉树的前、中、后序遍历1.前序遍历递归实现迭代法2.中序遍历递归迭代法3.后序遍历递归迭代二、二叉树的层次遍历三、二叉树的右视图四、二叉树的层平均值五、N叉树的层序遍历六、在每个树行中找最大值七、填充每个节点的下一个右侧节点指针(完全二叉树)八、填充每个节点的下一个右侧节点指针(普通二叉树)九、完全二叉树的节点个数![在这里插入图片描述](https://img-blog.csdnimg.cn/4ecfb9528fd44f388c1126f89885dd36.png

Pcl2001的博客 1770

wflow模型hbv

毛管水的处理 😄 快速流的处理 K4是为了产生基流的 找到了令人激动的kenematic模块 😄

m0_46268055的博客 781

【使用DeepSeek辅助Python接口性能自动化测试教程-实战教程】

访问DeepSeek官方网站,注册账号并获取API Key。此Key是调用DeepSeek API的必要凭证,务必妥善保管。安装时,注意勾选“Add Python to PATH”选项,以便系统能识别Python命令。确保你已安装Python 3.8或更高版本。会自动发现并执行所有以。

Dreams°的博客 2468

学习记录:js算法(四十四):二叉树的最大深度

我怎么就没想到使用递归呢?

weixin_48677331的博客 726

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1566

(爆)重写目前做过的81道LeetCode题目

从6月份我的Leetcode计划两个月以来,明显的感觉到了Python熟练度有所提升,这两个月的时间,断断续续做了大概100道题,在博客上目前记录的有82道,有些数据结构和算法的题目,包括一些技巧其实还不是很熟练。对于应届生来说,算法基础还是最重要的一部分。 同时我不太满足于仅有的Python水平的提升,并不是贪多,而是觉得语言是相通的,Python仍是我接触很多语言以来最喜欢的语言,我也想...

eswang的优快云博客 598

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode —— 二叉树

LeetCode —— 二叉树

Archer__13的博客 627

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

项目算法: 计算树形结构的深度(层数)

项目算法: 计算树形结构的深度(层数) 今天在写项目的后台管理系统时,遇到一个需要算法的地方.即拖动某一节点到另一节点时,需要判断能否达到目标节点,且达到目标节点后需要计算新的level,而这两个地方都需要计算拖动的树形结构的深度(层数).抽象出来即是下图: 这里有两种思路写这个算法,一种是递归写法(简洁),另一种是非递归写法. 下面用js语言都列出来.写法1:以抽象图为例, 下面代码中的root即...

qq_43318840的博客 2023

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【算法练习】leetcode算法题合集之二叉树篇

【算法练习】leetcode算法题合集之二叉树篇

秋装什么的博客 1423

二叉树的深度(js)

题目:力扣 思路:深度优先遍历,用一个变量记录当前的最大深度 代码: var maxDepth = function (root) { if (!root) return 0 let l = 0 function getMaxL(root, deep) { l = Math.max(l, deep) if (root.left) { getMaxL(root.left, d

qq_43119912的博客 552

Leetcode刷题总结-3.二叉树篇

二叉树有两种主要的形式:满二叉树和完全二叉树,满二叉树上只有度为0和2的节点,完全二叉树的定义是在除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置(通俗点说就是没填满的都在最后一层,而且是从左向右,没填满的都是在右边);

weixin_44924725的博客 588

104. 二叉树的最大深度 JavaScript实现

104. 二叉树的最大深度 题目链接 一、思想 对二叉树进行层次遍历,用一个变量指控层数即可。 二、代码实现 var maxDepth = function(root) { if(!root) return 0; let queue = []; // 初始化队列 queue.push(root); // 控制层数 let level = 0; // 遍历二叉树,队列不为空 while(queue.length){ // 弹

weixin_43466639的博客 303

leetcode二叉树

树的属性: 层次结构 一个节点的所有子节点独立于另一个节点的子节点。 二叉树:如果树中的每个节点最多有两个子节点,我们说该树是一个二叉树。 1.列表表示的树 在列表树的列表中,将根节点的值存储为列表的第一个元素;第二个元素:一个表示左子树的列表;第三个元素:表示右子树的另一个列表。 2.节点表示 用left 和right 的属性表示其他实例的引用。 3 . 树的遍历 前序:首先访问根节点,然...

qq_43283527的博客 685

104. 二叉树的最大深度

一道简单题,但是错几次,感觉很有价值,便记了下来。

云杉木屋 4775

二叉树的最大深度

#include<stdio.h> #include<stdlib.h> //Definition for a binary tree node. struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; //第一种写法 int Max(int a, int b) { if (a > b) return a;

Monster的博客 176

【算法笔记】二叉树的最大深度&&二叉树的最小深度

二叉树的最大深度 问题 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 分析 二叉树的最小深度 问题 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 分析 ...

weiwai的博客 479

js求二叉树的深度

求二叉树的深度 思路:1+Max(左边子树的深度,右边子树的深度) 代码如下: function deepPath(tree) { if(tree == null) { return 0 } else { let left = deepPath(tree.left) let right = deepPath(tree.right) return 1+Math.max(left,right) } } 树的结

jiwei_1234____5的博客 1011

LeetCode算法之--二叉树系列

二叉树的常见算法

程序大视界 872
上一篇: 数据结构与算法之二叉树: LeetCode 145. 二叉树的后序遍历 (Ts, Py, Go版)
下一篇: 数据结构与算法之二叉树: LeetCode 111. 二叉树的最小深度 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值