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

LeetCode - 杨辉三角 / 二叉树的最大深度

杨辉三角 / 二叉树的最大深度

 ​欢迎光临小站:致橡树

杨辉三角

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

 

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

提示:

  • 1 <= numRows <= 30

解题思路

这段代码是用于生成帕斯卡三角形(杨辉三角)的实现。给定一个非负整数 numRows,生成前 numRows 行的帕斯卡三角形。

代码逻辑
  1. 初始化

    • 创建一个 ArrayList 来存储结果,每个元素是一个 List<Integer> 表示一行

    • n 初始化为1,表示当前正在处理第1行

  2. 外层循环

    • while (numRows > 0) 控制生成的行数

    • 每次循环处理一行,numRows 减1,直到为0

  3. 处理每一行

    • 创建一个新的 ArrayList 来存储当前行的数字

    • 内层 for 循环填充当前行的每个元素:

      • 第一个和最后一个元素总是1(i == 0i == n-1 的情况)

      • 中间元素等于上一行对应位置和前一个位置元素的和(list.get(n-2).get(i-1) + list.get(n-2).get(i)

      • n-2 是因为列表从0开始索引,而 n 从1开始计数

  4. 添加行并更新计数器

    • 将当前行添加到结果列表中

    • n++ 准备处理下一行

    • numRows-- 减少剩余要处理的行数

示例

numRows = 5 为例:

  1. 第1行 (n=1): [1]

  2. 第2行 (n=2): [1, 1]

  3. 第3行 (n=3): [1, 2, 1] (1+1=2)

  4. 第4行 (n=4): [1, 3, 3, 1] (1+2=3, 2+1=3)

  5. 第5行 (n=5): [1, 4, 6, 4, 1] (1+3=4, 3+3=6, 3+1=4)

class Solution {public List<List<Integer>> generate(int numRows) {ArrayList<List<Integer>> list = new ArrayList();int n = 1;while (numRows > 0) {List<Integer> temp = new ArrayList(n);for (int i = 0; i < n; i++) {if (i == 0) {temp.add(1);continue;}if (i == (n - 1)) {temp.add(1);continue;}int left = list.get(n - 2).get(i - 1);int right = list.get(n - 2).get(i);temp.add(left + right);}list.add(temp);n++;numRows--;}return list;}public static void main(String[] args) {Solution solution = new Solution();List<List<Integer>> generate = solution.generate(1);System.out.println(generate);}
}

二叉树的最大深度

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

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

示例 1:

算法图片

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

示例 2:

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

提示:

  • 树中节点的数量在 [0, 104] 区间内。

  • -100 <= Node.val <= 100

解题思路

递归遍历左右子树

这段代码是一个求二叉树最大深度的递归实现,我们按执行逻辑梳理一下:

  1. 递归结束条件(base case)

    if (root == null) {return 0;
    }
    • 当当前节点为空,说明走到树的尽头(叶子节点的子节点),深度为 0

    • 这是递归的出口,避免无限递归。

  1. 递归计算左子树深度

    int left = maxDepth(root.left); 
    • root.left 递归调用 maxDepth

    • 直到走到空节点,才返回 0,然后逐层往上计算深度。

  1. 递归计算右子树深度

    int right = maxDepth(root.right); 
    • 同理,对右子树递归计算最大深度。

  1. 当前节点深度计算

    return Math.max(left, right) + 1; 
    • 左右子树深度取最大值

    • 再加上当前节点本身的这一层深度(+1

    • 逐层返回给上一级调用。

class Solution {public int maxDepth(TreeNode root) {if (root == null) {return 0;}int left = maxDepth(root.left);int right = maxDepth(root.right);return Math.max(left, right) + 1;}
}
广度遍历二叉树

采用广度优先搜索(BFS)的方法。下面是逐步逻辑分析:

  • 基本情况处理

    • 逻辑说明:如果根节点为空,说明树不存在,深度为 0。

if (root == null) {return 0;
}

  • BFS 初始化

    • 变量说明

      • level:记录当前深度,初始为 0。

      • queue:创建一个队列,并将根节点加入队列,作为遍历的起点。

int level = 0;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
  • BFS 主循环

    • 外层循环:当队列不为空时,说明还有节点需要处理,循环继续。

    • 内层循环

      • 目标:处理当前层的每一个节点。

      • 步骤:

        1. 从队列中取出一个节点。

        2. 将其非空的左、右子节点加入队列末尾。

        3. 计数器 size 减 1,表示已处理完当前层的一个节点。

      • size 减至 0 时,表示当前层所有节点已处理完毕。

while (!queue.isEmpty()) { // 外层循环int size = queue.size(); // 获取当前层的节点数量while (size > 0) { // 内层循环:处理当前层的所有节点TreeNode poll = queue.poll(); // 取出队首节点// 将该节点的子节点加入队列,作为下一层待处理的节点if (poll.left != null) {queue.add(poll.left);}if (poll.right != null) {queue.add(poll.right);}size--; // 当前层节点计数器减 1}level++; // 完成一层处理后,深度加 1
}
  • 返回结果

    • 逻辑说明:当队列为空时,表示所有节点都已处理完毕,返回累计的深度 level,即为树的最大深度。

return level;

这种方法通过层级遍历的方式,每处理完一层深度加1,最终得到的level就是树的最大深度。

  • 完整代码

class Solution {public int maxDepth(TreeNode root) {// 1. 基本情况处理if (root == null) {return 0;}// 2. BFS 初始化int level = 0;LinkedList<TreeNode> queue = new LinkedList<>();queue.add(root);// 3. BFS 主循环while (!queue.isEmpty()) {int size = queue.size(); // 获取当前层的节点数量// 处理当前层的所有节点while (size > 0) {TreeNode currentNode = queue.poll(); // 取出队首节点// 将该节点的子节点加入队列,作为下一层待处理的节点if (currentNode.left != null) {queue.add(currentNode.left);}if (currentNode.right != null) {queue.add(currentNode.right);}size--; // 当前层节点计数器减1}level++; // 完成一层处理后,深度加1}// 4. 返回结果return level;}
}

http://www.dtcms.com/a/573881.html

相关文章:

  • RV1126 NO.39:OPENCV查找图形轮廓并画框
  • 【第1章>第3节】基于FPGA的图像腐蚀处理算法的Verilog实现
  • 西安电子科技大学信息化建设处网站模板建站排版跟没缓存好似的
  • 神经网络—— 学习与感知器(细节补充)
  • tensorflow 图像分类 之一
  • 自己网站上做淘宝搜索引擎网站开发属于什么行业
  • 查询网站备案号网站如何做免费的推广
  • 编写一个DXE driver 提供遍历pcie设备配置空间的protocol
  • 随笔之工作方法的“术”
  • 淘宝上做进出口网站有哪些我男同同性做视频网站
  • LLM中的选择性注意:从人类聚焦到模型聚焦
  • 从成本到战略:金仓 KingbaseES 的多维度优势与企业数据库选型的核心考量
  • 做pc网站排wordpress载入慢
  • Java注解在Spring Boot中的详细原理与使用情况解析
  • Python + WebSocket 实现实时体育比分系统(含数据库设计与前端演示)
  • 揭阳智能模板建站网站转应用
  • 多个网站 备案吗工作室网站建设要多大内存
  • 借助 TX Text Control:在 .NET C# 中验证 PDF/UA 文档
  • 高光谱成像系统赋能烟叶分选(烟叶除杂、烟叶霉变、烟叶烟梗区分、烟叶等级分选)
  • Java NIO 深度解析:从 BIO 到 NIO 的演进与实战​
  • 聊聊AIoT开发效率与安全:从ARMINO IDK框架说起
  • 0.5、提示词中 System、User、Assistant 的基本概念
  • 响应式网站设计建设制作温岭app开发公司
  • 门户网站用什么程序做广州手机app开发
  • 用Python和FastAPI构建一个完整的企业级AI Agent微服务脚手架
  • 青岛网站域名备案查询个人网站做哪些内容
  • Leet热题100--208. 实现 Trie (前缀树)--中等
  • 应用分析网站网站社区建设
  • 【上海海事大学主办】第六届智能电网与能源工程国际学术会议(SGEE 2025)
  • 每月网站开发费用网站改版如何做301