1.问题描述

        给你一棵二叉树的根节点,返回该树的 直径 。

        二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

        两节点之间路径的 长度 由它们之间边数表示。

        示例1

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

        示例2 

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

        提示

  • 树中节点数目在范围 [1, 104] 内
  • -100 <= Node.val <= 100

        难度等级

                简单

        题目链接

                二叉树的直径

2.解题思路

        这道题目是要求二叉树的直径,这道题如果搞清楚了各个概念直接的关系,就会变得非常简单,我们一起来看一下。

        首先,我们要求的是二叉树的直径,根据题目给的定义,二叉树的直径是二叉树中任意两个节点之间最大路径的长度。所以我们的问题就是找到最大的路径长度,而路径长度=经过的节点数-1。所以,我们可以把问题转化为求经过最多的节点数。

        我们要求经过最多的节点数,怎么样才能经过尽可能多的节点数呢?那肯定要最深的节点一直到根节点再转向,转向到另外一棵子树的最深节点处。但是这里有一个问题,就是到根节点转向,不一定就是最多的节点数,可能另外一棵子树没有多少节点呢?反而可能是在某一个节点转向之后,节点数更多。所以,我们的解决办法就是求出以每一个节点为根节点,从左最深处到右最深处的节点数,然后取最大值。

        这里要明确一点,要从左最深处到右最深处,那我们就要分别求出左右两颗子树的深度。那这个问题就被转化为求最大深度的问题了。

        我们定义一个变量,用来更新最大节点数。

    //存储经过的最大节点数int result = 1;

        递归的结束条件是,如果节点为空,直接返回0就可以了。

        //空节点返回0if(node == null){return 0;}

        然后我们就可以对左右子树递归求深度,然后取左右子树的最大值+1(这里的+1指加上当前根节点本身)进行返回。

        //左子树的深度int L = dfs(node.left);//右子树的深度int R = dfs(node.right);.....return Math.max(L,R) + 1;

        到这里,我们已经完成了求最大深度的逻辑。但是我们还缺少了求最大节点数的逻辑。到这一步,已经不难了,因为我们前面已经递归求了左右子树的深度,我们只需要将左子树的深度加上右子树的深度,再加1,就是以当前节点为根,所可能经过的最大节点数了。这里的+1(是因为要从左最深到右最深,必须经过当前节点,所以要把当前节点也算上)。将以当前节点为根所经过的最大节点数与全局已经记录的最大节点数进行比较,取最大值即可。

        //更新经过的最大节点数result = Math.max(result,L + R + 1);

        当我们求完整个树的深度时,我们的最大节点数也就跟着求出来了。此时,只需要按照定义,将经过的最大节点数-1返回即可。

        dfs(root);//直径=经过的最大节点数-1return result - 1;

3.代码展示

/*** 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 {int result = 1;public int diameterOfBinaryTree(TreeNode root) {dfs(root);//直径=经过的最大节点数-1return result - 1;}public int dfs(TreeNode node){//空节点返回0if(node == null){return 0;}//左子树的深度int L = dfs(node.left);//右子树的深度int R = dfs(node.right);//更新经过的最大节点数result = Math.max(result,L + R + 1);return Math.max(L,R) + 1;}
}

4.总结

        这道题,只需要理清几个概念直接的关系,就可以将问题简化成我们曾经做过的求深度问题,这样问题也就轻松解决了。今天这道题就啰嗦到这,祝大家刷题愉快~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/73051.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/73051.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/73051.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言每日一练——day_4

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第四天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

工作流编排利器:Prefect 全流程解析

工作流编排利器&#xff1a;Prefect 全流程解析 本文系统讲解了Prefect工作流编排工具&#xff0c;从基础入门到高级应用&#xff0c;涵盖任务与流程管理、数据处理、执行器配置、监控调试、性能优化及与其他工具集成等内容&#xff0c;文末项目实战示例&#xff0c;帮助读者全…

Web Workers 客户端 + 服务端应用

一. Web Workers 客户端应用 使用 JavaScript 创建 Web Worker 的步骤如下&#xff1a; 1.创建一个新的 JavaScript 文件&#xff0c;其中包含要在工作线程中运行的代码&#xff08;耗时任务&#xff09;。该文件不应包含对 DOM 的引用&#xff0c;因为在工作线程中无法访问 …

大模型工具Ollama存在安全风险

国家网络安全通报中心&#xff1a;大模型工具Ollama存在安全风险 来源&#xff1a;国家网络与信息安全信息通报中心 3月3日&#xff0c;国家网络安全通报中心发布关于大模型工具Ollama存在安全风险的情况通报&#xff0c;内容如下&#xff1a; 据清华大学网络空间测绘联合研…

LINUX系统安装+添加共享目录

一、前言 Windows或mac系统中创建Linux工作环境是基于VMware和SL(Scientific Linux)&#xff0c;下面分别安装二者。 二、VMware软件安装及注册 1、双击VMware安装包 2、点击下一步 3、 勾选接受许可&#xff0c;并点击下一步 4、更改路径&#xff08;建议更改为容易找到的路…

BI 工具响应慢?可能是 OLAP 层拖了后腿

在数据驱动决策的时代&#xff0c;BI 已成为企业洞察业务、辅助决策的必备工具。然而&#xff0c;随着数据量激增和分析需求复杂化&#xff0c;BI 系统“卡”、“响应慢”的问题日益突出&#xff0c;严重影响分析效率和用户体验。 本文将深入 BI 性能问题的根源&#xff0c;并…

基于SSM+Vue的汽车维修保养预约系统+LW示例

1.项目介绍 系统角色&#xff1a;管理员、员工、用户功能模块&#xff1a;用户管理、员工管理、汽车类型管理、项目类型管理、维修/预约订单管理、系统管理、公告管理等技术选型&#xff1a;SSM&#xff0c;vue&#xff08;后端管理web&#xff09;&#xff0c;Layui&#xff…

在rocklinux里面批量部署安装rocklinx9

部署三台Rockylinux9服务器 实验要求 1. 自动安装ubuntu server20以上版本 2. 自动部署三台Rockylinux9服务器&#xff0c;最小化安装&#xff0c;安装基础包&#xff0c;并设定国内源&#xff0c;设静态IP 实验步骤 安装软件 # yum源必须有epel源 # dnf install -y epel-re…

Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)

背景&#xff1a;问题如上标题&#xff0c;H3C所有交换机配置的model都是comware 解决方案&#xff1a; 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…

mac本地安装运行Redis-单机

记录一下我以前用的连接服务器的跨平台SSH客户端。 因为还要准备毕设...... 服务器又过期了&#xff0c;只能把redis安装下载到本地了。 目录 1.github下载Redis 2.安装homebrew 3.更新GCC 4.自行安装Redis 5.通过 Homebrew 安装 Redis 安装地址&#xff1a;https://git…

C++学习之格斗小游戏综合案例

C格斗游戏效果视频 1.案例简介 #include "broadSword.h" //构造函数 BroadSword::BroadSword() { FileManager fm; map<string, map<string, string>> mWeapon; fm.loadCSVData("Weapons.csv", mWeapon); //武器id string id …

《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》

导语​ "你是否想过用Python开发一款可玩性高的双人合作游戏&#xff1f;本文将分享如何从零开始实现一款类《吸血鬼幸存者》的生存射击游戏&#xff01;包含完整源码解析、角色系统设计、敌人AI逻辑等核心技术点&#xff0c;文末提供完整代码包下载&#xff01;" 哈…

【理想解法学习笔记】

目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是&#xff1a;首先建立初始化决策矩阵&#xff0c;而后基于规范化后的初…

Linux基础开发工具—vim

目录 1、vim的概念 2、vim的常见模式 2.1 演示切换vim模式 3、vim命令模式常用操作 3.1 移动光标 3.2 删除文字 3.3 复制 3.4 替换 4、vim底行模式常用命令 4.1 查找字符 5、vim的配置文件 1、vim的概念 Vim全称是Vi IMproved&#xff0c;即说明它是Vi编辑器的增强…

Skyvern AI 实现 浏览器爬虫+自动化工具

一、前言 本文Skyvern是一款功能强大的模拟浏览器自动化操作爬虫软件。它通过模拟人类在浏览器中的操作&#xff0c;实现对目标网站的自动化访问、数据抓取和处理。Skyvern支持多种编程语言&#xff0c;用户可根据需求编写脚本&#xff0c;实现高效的数据采集。同时&#xff0c…

Spring Boot + MyBatis + MySQL:快速搭建CRUD应用

一、引言 1. 项目背景与目标 在现代Web开发中&#xff0c;CRUD&#xff08;创建、读取、更新、删除&#xff09;操作是几乎所有应用程序的核心功能。本项目旨在通过Spring Boot、MyBatis和MySQL技术栈&#xff0c;快速搭建一个高效、简洁的CRUD应用。我们将从零开始&#xff…

【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities

OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth&#xff1f;2. OAuth 2.0 是如何工作的&#xff1f;3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…

C#常用的循环语句

在C#中&#xff0c;循环是一种控制结构&#xff0c;用于重复执行一组语句直到满足特定条件。C#提供了几种循环结构&#xff0c;包括for循环、while循环、do-while循环和foreach循环。每种循环都有其特定的用途和场景。下面我将逐一介绍这些循环的用法。 一、C#循环类型 1. fo…

C语言(23)

字符串函数 11.strstr函数 1.1函数介绍&#xff1a; 头文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一个字符串&#xff08;str1&#xff09;中寻找另外一个字符串&#xff08;str2&#xff09;是否出现过 如果找到…

Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)

目录 &#xff08;1&#xff09;Vue3工程环境准备、项目基础脚手架搭建详细教程。(博客链接) &#xff08;2&#xff09;Vue3的基础语法学习与使用。 &#xff08;1&#xff09;"{{}}"绑定数据。 <1>ref()函数定义变量——绑定数据。 <2>reactive({...})…