数据结构与算法之二叉树: Leetcode 104. 二叉树的最大深度 (Typescript版)

news/2025/2/12 3:22:46/

二叉树的最大深度

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

描述

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

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

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

示例

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

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

算法实现

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 = 0while(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

http://www.ppmy.cn/news/88036.html

相关文章

极米H6搭载光学变焦打造无损4K,带来更沉浸观影体验

近年来,科技飞速发展,我国涌现出很多新兴科技企业,如家用智能投影、无人机、扫地机器人等行业发展迅速,国际竞争力逐年增强。其中,家用智能投影行业成长快速,正展现出蓬勃的发展生机。根据IDC自2015到2022年…

Python爬虫被封ip解决方案

在使用 Python 程序进行网络爬虫开发时,可能因以下原因导致被封 IP 或封禁爬虫程序: 1、频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次,从而对目标网站造成较大的负担和压力,这种行为容易引起目标网站的注意并被封禁…

使用github CICD 简单部署vue项目

1.首先先创建一个github访问地址,关于Github Pages的域名访问地址,在github上新建一个以域名为名称的仓库即可,一般都是githubname.github.io 2.首先创建vue项目,这里我就使用自己写的前端项目脚手架来创建vue项目 这里顺便把图标…

【jeecg-boot】jeecg-boot的一些功能扩展:

文章目录 一、Template里面将数组对象里面的值遍历>对象的key二、利用ES6的解构赋值互换数组数据:三、a-select实现可输入可下拉:四、a-table实现动态表头:五、jeecg-boot列自定义:六、jeecg-boot合计行: 一、Template里面将数…

Kotlin SOLID 原则

Kotlin SOLID 原则 许多 Kotlin 开发者并不完全了解 SOLID 原理,即使他们知道,他们也不知道为什么要使用它。您准备好了解所有细节了吗? 介绍 亲爱的 Kotlin 爱好者,您好!欢迎来到我的新文章。今天我要讲的是 Kotli…

网络设备端口别名设置

网络设备端口通常使用数字编号,如FastEthernet 0/1,GigabitEthernet 1/0/1等。这些数字表示方法虽然清晰准确,但当管理大量网络设备和端口时,数字表示法的可读性会变差,并不利于记忆。 端口别名可以为端口设置一个自定义的别名,使用户更易识别和记住各端口的连接情况。主流网络…

如何在Angular应用程序中插入自定义 CSS?这里有答案!

Kendo UI for Angular是专用于Angular开发的专业级Angular组件,telerik致力于提供纯粹的高性能Angular UI组件,无需任何jQuery依赖关系。 Kendo UI R1 2023正式版下载(Q技术交流:726377843) 为什么需要在 Angular 应用程序中插入…

fastapi异步框架操作的理解

FastAPI的异步操作是指在处理请求时,使用异步代码来实现请求的处理。这种异步操作可以提高Web应用程序的性能和响应速度。异步操作使得Web应用程序可以在等待其他资源(如数据库或网络请求)响应时继续处理其他请求,从而提高了Web应…