代码随想录算法训练营第十六天| LeetCode104.二叉树的最大深度、LeetCod559.n叉树的最大深度、LeetCode111.二叉树的最小深度、LeetCode222.完全二叉树的节点个数

OpenCV 算法梳理分析 本文系统梳理了OpenCV的核心算法体系,从模块架构到具体函数实现。OpenCV采用分层设计,包含基础I/O、图像处理、特征检测、视频分析和智能算法五大层次,所有模块基于统一的Mat数据结构。重点分析了imgproc模块的8类图像处理算法(滤波、形态学、阈值化等),features2d模块的特征检测与匹配流程(SIFT/ORB等算法对比),以及objdetect、video、calib3d等模块的核心功能。针对不同场景提供了算法选型建议,如高斯噪声推荐GaussianBlur,特征匹配推荐ORB+Flann 阅读详情

#LeetCode 104. Maximum Depth of Binary Tree

#LeetCode 104. 视频讲解:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度_哔哩哔哩_bilibili

深度:根节点到该节点的节点数,主要用前序遍历。

高度:该节点到叶子节点的节点数,主要用后序遍历。

本题中的最大深度,即为二叉树的高度,所以选择使用后序遍历。

在这个过程中没有单独设置一个变量来记录层数,而是使用遍历到末端节点后逐次加一得到的。

后序遍历方法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

#LeetCode 559. Maximum Depth of N-ary Tree

#LeetCode 559. 文字讲解:​​​​​​​代码随想录

观察节点的定义发现,子节点是通过一个List 接口来记录的,所以需要遍历所有的节点来比较哪一个节点的深度最大。我们此时需要一个depth 变量来记录层数。通过for 循环来遍历不同的子节点,此时对比的是depth (目前的最大层数)与目前遍历的child 层数。

后序遍历方法:

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        int depth = 0;
        if (root.children != null) {
            for (Node child: root.children) {
                depth = Math.max(depth, maxDepth(child));
            }
        }
        return depth + 1;
    }
}

#LeetCode 111. Minimum Depth of Binary Tree

#LeetCode 111. 视频讲解:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度_哔哩哔哩_bilibili

最小深度中需要注意的问题是根节点到叶节点的最小深度,而叶节点指的是左右孩子都为空的节点。所以,一颗没有左孩子的二叉树的深度应该看右子树的最小深度。依然是考虑用后序遍历来求最小高度,转化为深度。

递归三部曲:

确定递归函数的参数和返回值:参数为根节点,返回值为integer。

确定终止条件:如果root 节点为空。

确定单层递归的逻辑:按照后序遍历左右中的顺序遍历,在选择左右子树最小值时需要多考虑一下,是否存在左子树或者右子树为空,但是另一个子树非空的情况。

后序遍历方法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int result = 0;
        int leftHeight = minDepth(root.left);
        int rightHeight = minDepth(root.right);
        if (root.left == null && root.right != null) {
            return rightHeight + 1;
        }
        if (root.left != null && root.right == null) {
            return leftHeight + 1;
        }
        
        result = Math.min(leftHeight, rightHeight) + 1;
        
        return result;
    }
}

#LeetCode 222. Count Complete Tree Nodes

#LeetCode 222. 视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量_哔哩哔哩_bilibili

如果是使用递归方法,则是普通的计数方法。在这个题目中还可以考虑使用完全二叉树的特性,来完成。如果一棵树是满二叉树(满二叉树一定是完全二叉树),那么它的节点数是2^{n} - 1,其中n 代表的是层数。在完全二叉树中一般有两种情况,如果不是满二叉树,那么则为最后一层没满。如果是满二叉树,则可以用公式来求解,如果是最后一层没有满,那么考虑递归,递归到某一个深度后一定有左孩子或者右孩子为满二叉树,然后再用满二叉树的特性。

递归方法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        // recursion
        if (root == null) {
            return 0;
        }
        int leftCount = countNodes(root.left);
        int rightCount = countNodes(root.right);
        int result = leftCount + rightCount + 1;
        return result;
    }
}

利用二叉树的特性方法:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 0;
        int rightDepth = 0;
        while (left != null) {
            left = left.left;
            leftDepth++;
        }
        while (right != null) {
            right = right.right;
            rightDepth++;
        }
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
大彩串口屏+LUA避坑指南:从Flash读写到控件状态配置的5个常见问题 本文针对大彩串口屏的LUA脚本开发,深度剖析了Flash数据存储与控件状态配置中的5个常见陷阱。重点讲解了如何通过标志位安全初始化Flash、正确处理多字节数据转换,以及如何精准配置按钮与文本控件的状态与事件响应,帮助开发者提升开发效率与代码可靠性。 阅读详情

相关推荐

北斗导航 | 从零开始学习基于奇偶矢量的接收机自主完好性监测(RAIM)算法及改进

接收机自主完好性监测(Receiver Autonomous Integrity Monitoring, RAIM)是GNSS接收机内部的一种算法,它仅利用冗余的伪距观测量来判断定位结果是否可靠、是否存在故障卫星,并能识别和排除故障卫星。奇偶矢量法是RAIM最经典的实现方式之一,它将不可直接观测的测量误差映射到一个“奇偶空间”中,使故障检测变得简单且服从精确的概率分布。w\mathbf{w}w虽然能反映故障,但它的协方差矩阵不是单位阵,各分量相关,不利于统计检验。奇偶矢量通过一个正交变换P。

尘世冰封的专栏 360

小红书 算法一面 十一

例如 **Soft MoE** 采用这种方式,大幅提升负载均衡性,但会增加计算开销。- **熵正则化**:直接最大化门控概率分布的熵,熵越大表示分布越均匀,公式为 $\mathcal{L}_{ent} = -\frac{1}{N}\sum_{i=1}^N\sum_{k=1}^K p_{ik}\log p_{ik}$。- **核心原理**:源自 **GShard** 和 **Switch Transformer**,通过最小化专家选择概率分布的熵,迫使门控网络给每个专家分配相近的 token 数量。

XLYcmy的博客 438

深度学习论文: Cultivated Land Extraction from High-Resolution Remote Sensing Image

深度学习论文: Cultivated Land Extraction from High-Resolution Remote Sensing Image The Winning Solution to the iFLYTEK Challenge 2021 Cultivated Land Extraction from High-Resolution Remote Sensing Image PDF: https://arxiv.org/pdf/2202.10974.pdf PyTorch代码: https:

mingo_敏 3429

数据库连接算法详解:从基础概念到嵌套循环优化

2.重复键在归并连接中的处理:排序归并连接遇到相同键时,需要保存或回溯同一键对应的记录组,然后输出笛卡尔积。(2)外连接:即使一方没有数据,也保留该侧数据,用NULL填充。对S中的键计算哈希值;(3)连接基数:连接结果的行数可能远大于任意一张输入表。设外表有R个页面,内表S个页面,比较次数O(R+R*S)5.哈希连接的限制:最适用于等值连接,不直接适用于比较。(1)build阶段:对较小的关系R建立哈希表。(1)内连接:只保留两张表之中能够匹配的内容。若R有M行,S有N行,则比较次数为O(MN)

jiangxiaohanya的博客 236

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 题目要求在数组中找到两数之和等于目标值的下标。核心思路是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(n²),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 258

算法日常・每日刷题--<BFS>4

题目摘要: 给定一个由'X'和'O'组成的矩阵,要求捕获所有被'X'完全包围的'O'区域(即不与边界连通的区域),并将其替换为'X'。解法核心是逆向处理: 标记边界连通区域:遍历矩阵四边,对边界上的'O'进行BFS/DFS,标记所有与之连通的'O'为临时符号(如'.'),表示这些区域未被包围。 批量修改:遍历整个矩阵,将未被标记的'O'(被包围的)改为'X',同时恢复标记的'.'为'O'。 示例: 输入: [['X','X','X','X'], ['X','O','O','X'], ['X','X','O'

2503_92261635的博客 257

10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 221

AI辅助芯片制造:算法与工程化落地

《国产DRAM龙头长鑫科技上市创纪录,AI技术重塑芯片制造新范式》 国产DRAM龙头企业长鑫科技7月27日登陆科创板,创下3.31万亿元市值,成为A股"一哥"。作为大陆唯一实现DRAM大规模量产的IDM企业,长鑫科技标志着国产存储产业的重要突破。随着AI算力需求激增,DRAM市场迎来高速发展期。AI技术正在深度改变芯片制造模式,在工艺仿真、缺陷检测、设备维护等环节发挥关键作用,显著提升良率和效率。长鑫科技高管推荐的新书《AI辅助芯片制造:算法与工程化落地》系统解析了AI赋能半导体制造的实战方案

weixin_43178406的博客 9801

二刷hot100-70.爬楼梯

dp数组初始化:dp[n+1];

2302_78497251的博客 49

S 曲线加减速算法完整详解(C# 原生实现,无第三方库)

S 曲线加减速是工业运动控制核心轨迹规划算法,相比梯形曲线,依靠约束加加速度 Jerk 实现加速度连续变化,有效消除机械冲击与振动。本文完整讲解七段式 S 曲线原理、阶段推演、时间预规划逻辑,剖析短行程自动裁剪等工程难点。提供无第三方依赖原生 C# 完整实现,内置运动状态机,支持正反方向运动,基于解析多项式实时求解位置、速度、加速度,无积分累积误差。代码可直接用于伺服上位机、模组轨迹发生器,亦可精简移植嵌入式平台。同时对比算法优劣与适用场景,适合工控开发、伺服调试、嵌入式运动算法学习者参考。

工业上位机开发工程师,专注C#底层算法与工控仪器开发。从零手写信号滤波、曲线拟合、机器视觉、排序与密码学哈希,纯原生实现零第三方库,附数学推导与可编译源码,可移植STM32/PLC。 961

Tokenization(分词算法):一切大语言模型的地基

本文深入解析了Tokenization(分词算法)这一大语言模型的基础技术。Tokenization将原始文本切分为模型可处理的子词单元并映射为数字ID,是模型理解文本的第一步。

2301_80194949的博客 199

LeetCode 28. 找出字符串中第一个匹配项的下标(暴力匹配 + KMP 算法详解)

本文介绍了LeetCode 28题"找出字符串中第一个匹配项的下标"的两种解法:暴力匹配和KMP算法。暴力匹配通过逐个字符比较实现,时间复杂度O(m×n);KMP算法利用next数组跳过不必要匹配,时间复杂度O(m+n)。文章详细解释了KMP的核心思想,包括next数组的定义和构建过程,并提供了Python和Java的代码实现。两种方法各具特点:暴力匹配简单直观,KMP更高效但实现复杂,适合处理长字符串匹配问题。

2603_95532426的博客 230

一文读懂:字典序的第K小数字

可以按照层次遍历子树,firsti 指向第 i 层的最左侧的孩子节点, lasti 指向第 i 层的最右侧的孩子节点,根据推理可以知道: firsti = 10 × firsti − 1 ,lasti = 10 × lasti − 1 + 9 ,第 i 层共有 lasti − firsti + 1 个节点,由于所有的节点都需要满足小于等于 n ,所以第 i 层的最右侧节点应该为 min(n,lasti) ,不断迭代直到 firsti > n 则终止向下搜索。

2501_92927469的博客 206

关于字符串【力扣151.反转字符串中的单词的思考】

【摘要】本文介绍了字符串反转问题的解决方案。通过三个关键步骤实现:首先去除多余空格,然后整体反转字符串,最后逐个反转单词。方法强调函数封装思想,将不同功能模块化处理。注意事项指出需特别关注函数封装在代码复用和维护中的重要性,这种分步处理方法能有效提高代码可读性和执行效率。

wasb666的博客 491

leetcode 104二叉树最大深度

为根的树深度是 1。

qq_63176310的博客 237

知识拓展:RFPDupeFilter 与请求指纹算法详解

Scrapy 2.17 去重源码详解:RFPDupeFilter 就是一个 set 加一个文件。拆解指纹算法,实测暴露默认端口与相对路径不归一化两个坑,给出规整中间件和自定义指纹方案。

Minner 291

分治题目:所有可能的真二叉树

二叉树中只有一个结点时,唯一的结点是根结点,没有子结点,因此是真二叉树,此时真二叉树中的结点数是奇数。个结点的真二叉树满足左子树和右子树的结点数都是奇数且左子树和右子树的结点数之和是。个结点时,将其中一个叶结点增加两个子结点之后仍为真二叉树,新的真二叉树中有。是奇数时,遍历左子树和右子树的结点数,然后递归地构造左子树和右子树。根据真二叉树的定义,真二叉树中的每个结点的子结点数是。真二叉树中的结点数是奇数,可以使用数学归纳法证明。答案的每个元素都是一个真二叉树的根结点。时只有一个结点的二叉树是真二叉树

stormsunshine的博客 161

算法札记:利用floyd判环算法优化SPFA判负环算法

本文提出了一种优化SPFA算法检测负环的方法,使用Floyd判环算法替代传统的DFS判环。作者在SPFA中增加了计时器和Floyd判环(龟兔赛跑算法),当步数超过2n时启动判环检查。代码实现中,cycle()函数实现了Floyd判环逻辑,通过比较慢指针和快指针来检测环的存在。经测试,该优化在Acwing平台上比朴素SPFA快50倍,比基于栈的优化版本快1.2-1.4倍。这种方法显著提高了负环检测效率,尤其适用于大规模图论问题。

Keven_11的博客 273

27届京东、联想秋招笔试刷题总结算法

这道题就是让你写代码实现这个**“筛选 -> 组队 -> 再筛选 -> 再组队”的过程。难点不在于算法原理,而在于如何高效地表示集合**(比如用元组或位运算)以及如何快速判断子集是否存在(剪枝)。

2302_80229489的博客 148

LeetCode 双题:415. 字符串相加与 143. 重排链表

本文讲解了两道算法题:字符串相加和重排链表的解法。 字符串相加(415题): 模拟竖式加法,从字符串末尾开始逐位相加 使用双指针和进位变量 注意处理不等长字符串和最后进位 时间复杂度O(n),空间复杂度O(n) 重排链表(143题): 分三步:找中点(快慢指针)、反转后半段、交叉合并前后两部分 注意保存后继节点和边界条件处理 时间复杂度O(n),空间复杂度O(1) 两道题都体现了将复杂操作分解为简单步骤的解题思路。

2401_87662859的博客 286

羊了个羊玩法(Unity2020.3.48f1)

Unity游戏工程源码。使用Unity2020.3.48f1版本打开。羊了个羊玩法。游戏视频截图及更多游戏工程源码请访问我的主页博客“Unity3D休闲益智游戏工程源码大合集”,该工程仅供学习使用。

上一篇: 代码随想录算法训练营第十五天| LeetCode102.层序遍历、LeetCode226.翻转二叉树、LeetCode101.对称二叉树2
下一篇: 代码随想录算法训练营第十七天| LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和
Alilam
博客等级 码龄6年 337粉丝 · 40原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值