LeetCode100之二叉樹的直徑(543)--Java

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({...})…