二叉樹題解——二叉樹的直徑【LeetCode】

543. 二叉樹的直徑

一、算法邏輯(逐步通順講解每一步思路)

🎯 問題目標:

求二叉樹中任意兩個節點之間的最長路徑(以邊數計算)。


? 1?? 初始化變量

  • ans 用于記錄目前遍歷過程中的最大直徑(最長路徑上的邊數);

  • 與上一版本不同:本實現中,返回的深度以“邊數”定義,而不是“節點數”

    • 即:空節點深度為 -1,葉子節點深度為 0。


? 2?? 定義遞歸函數 depth(node)

目標:返回當前 node 為根節點的最大深度(邊數表示)。

處理流程如下:

? 遞歸基:
  • 如果 nodeNone,說明是空節點,返回 -1。

? 正常遞歸:
  • 遞歸獲取左右子樹的深度,并在返回值上 +1,表示當前節點比子樹多一層邊:

? 直徑更新:
  • 每個節點可能作為一條最長路徑的“中心節點”,該路徑長度為 L + R(左右邊之和);

  • 用這個值更新最大值 ans

? 返回當前節點的最大深度(左右中更大的那一個):

? 3?? 主調用邏輯

  • 從根節點開始深度遍歷;

  • 遞歸完成后,ans 中即保存了整棵樹的最大直徑(邊數形式,無需再減 1);

  • 最終返回 ans

二、核心點總結

這段實現與傳統寫法不同之處在于:

? 把“深度”定義為邊數而不是節點數,從而避免最后再手動減 1 的步驟,計算更直接。

  • 使用 nonlocal ans 來更新封閉作用域內的變量;

  • 所有的直徑判斷都在遞歸過程中逐層進行更新;

  • 核心仍是:后序遍歷,自底向上構建子樹信息并合并更新全局答案。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = rightclass Solution:def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:ans = 0def depth(node: Optional[TreeNode]) -> int:if node is None:return -1L = depth(node.left)+1R = depth(node.right)+1nonlocal ansans = max(ans, L+R)return max(L, R)depth(root)return ans

三、時間復雜度分析

  • 每個節點只訪問一次;

  • 每次訪問只做常數次操作;

時間復雜度:O(n),其中 n 為節點數。


四、空間復雜度分析

  • 空間主要來自遞歸調用棧;

  • 最壞情況為鏈狀樹 → O(n),最好情況為平衡樹 → O(log n);

空間復雜度:O(h),其中 h 是樹的高度。


? 總結一句話

本算法通過“將深度定義為邊數”的方式,避免了最終再減 1 的步驟,依然使用后序遞歸 + 非局部變量更新最大直徑的策略,在 O(n) 時間、O(h) 空間內求出二叉樹的最大直徑。該寫法更貼近“邊”的定義,簡潔且邏輯緊湊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89679.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android開發 Android10及10+讀取外部存儲問題

前提 : 在做文件遍歷時,有的文件在Android10無法訪問,在注冊清單下添加android:requestLegacyExternalStorage"true"后可正常訪問,但一直不知道具體原因。 使用XXPermissions時讀到Android10分區存儲后才明白這里的邏輯…

IP地理定位技術綜述:理論、方法與應用創新(三)

[1]劉學婷,臺文鑫,周帆,等.IP地理定位技術綜述:理論、方法與應用創新[J].通信學報,2025,46(04):33-48. 2 IP地理定位應用場景 基于 IP 地理定位技術的特性和多樣化應用場景,本文將其主要應用分為地理定位服務、網絡安全與優化、網絡空間測繪3類,如圖7所示。基于IP地理定位…

16-C#生成DLL與調用

C#生成DLL與調用 1.2.3.4.5.將DLL文件復制到DEBUG下6.7.8.private void button79_Click(object sender, EventArgs e) {ClassLibrary1.Class1 testnew ClassLibrary1.Class1();UInt16 aConvert.ToUInt16(textBox67.Text);UInt16 b Convert.ToUInt16(textBox68.Text);label90.T…

JSON解析工具哪家強?

一、研究背景與目的 在現代Java應用開發中,JSON數據格式的解析性能直接影響系統響應速度與吞吐量。當處理高并發請求或大規模數據轉換時,解析工具的選擇尤為關鍵。本文通過JMH(Java Microbenchmark Harness)基準測試框架&#xf…

Go語言動態數據訪問實戰

Go語言反射實戰:動態訪問商品數據中的復雜字段 前言 在電商或倉儲管理系統中,商品信息結構復雜且經常變化。比如商品有基本屬性(ID、名稱、類型),還有動態擴展屬性(規格、促銷信息、庫存詳情等&#xff0…

[特殊字符] Excel 按月篩選 + 工作表復制 + 樣式批量處理 —— Python 自動化大匯總

本教程展示如何使用 Python 的 openpyxl 實現: 多工作表遍歷:自動查找每月物料表; 條件篩選:獲取 G 列數量大于 1000 的記錄; 生成匯總表:從模板復制頁面并寫入篩選結果; 統一樣式&#xff1…

Text2SQL主流實現方案

目錄 基于 Prompt Engineering 的方案 基于模型微調的方案 T5 模型結構 MIGA 基于RAG 的方案 參考 基于 Prompt Engineering 的方案 這類方案比較簡單粗暴,就是通過精心設計的提示來引導 LLM 生成 SQL,一般包含下面這些做法: 1. 零樣本提示:直接向 LLM 提供數據庫…

有哪些開源的SSO框架?

SSO(Single Sign-On)是一種身份驗證機制,允許用戶通過一次登錄訪問多個相互信任的系統或應用,無需重復輸入憑證。核心目標是提升用戶體驗和安全性,減少密碼疲勞和管理成本。?一、常見開源SSO框架概覽?開源SSO框架主要…

LoRA 問答微調與部署全流程:基于 LLaMA-Factory + DeepSeek + FastAPI 打造專屬大模型

想快速掌握大模型落地實戰?本文將手把手教你完成一個國產大模型的微調任務,并通過 FastAPI 向后端暴露接口。特別適合希望快速將大模型應用于實際業務的開發者。 📌 本文為《LoRA 應用實錄》系列第 3 篇,在第一篇里講解了LoRA在 …

分布式部署下如何做接口防抖---使用分布式鎖

防抖也即防重復提交,那么如何確定兩次接口就是重復的呢?首先,我們需要給這兩次接口的調用加一個時間間隔,大于這個時間間隔的一定不是重復提交;其次,兩次請求提交的參數比對,不一定要全部參數&a…

【Java工程師面試全攻略】Day10:系統性能優化全鏈路實踐

一、性能優化的多維視角 系統性能優化是區分普通開發者與高級工程師的關鍵能力指標。根據Google的研究,性能優化帶來的用戶體驗改善可以直接轉化為商業收益——頁面加載時間每減少100ms,亞馬遜的銷售額就增加1%。今天我們將從全鏈路視角剖析性能優化的方…

在kotlin中如何更好的理解 高階函數

在 Kotlin 中,高階函數的本質是「將函數作為商品流通的交易模式」。 核心需求:傳統函數只能操作數據(如數字、字符串),但實際開發中常需復用邏輯流程(如「先校驗參數,再執行操作」的流程適用于…

15-C#的scottplot控件庫繪制曲線圖

C#的scottplot控件庫繪制曲線圖 1.使用Nuget 安裝scottplot控件庫2.繪制柱狀圖private void button54_Click(object sender, EventArgs e){double[] values { 5, 10, 7, 13, 22, 18, 33, 16 };formsPlot1.Plot.Add.Bars(values);formsPlot1.Refresh();}3.中文標題顯示問題 for…

使用jiaminghi/data-view-react, 本地調試能顯示,發布就不顯示|不成功(版本沖突)

你遇到的問題是: 使用 jiaminghi/data-view-react(也就是 DataV 可視化組件庫),本地調試沒問題,但發布后打包上線卻不顯示圖表/組件。 ? 常見原因(很大概率命中) 1. CSS 或字體資源路徑丟失 …

網絡層:ip協議 與數據鏈路層

目錄 網絡層 引子與前置知識 一、協議格式 二、網段劃分(重要) 三、特殊的IP地址 四、IP地址的數量限制 五、私有IP地址和公網IP地址 六、理解運營商和全球網絡 七、路由 八、協議格式補充 數據鏈路層 一、以太網幀格式 二、局域網的通信原理 三、認識MTU 四、…

Nginx入門進階:從零到高手的實戰指南

Nginx 入門與進階玩法指南 一、什么是 Nginx? Nginx(Engine X)是一個高性能的 HTTP 和反向代理服務器,同時也可以作為 IMAP/POP3/SMTP 郵件代理服務器。它最初由俄羅斯程序員 Igor Sysoev 開發,用于解決高并發下 Apa…

NPM組件 alan-baileys 等竊取主機敏感信息

【高危】NPM組件 alan-baileys 等竊取主機敏感信息 漏洞描述 當用戶安裝受影響版本的 alan-baileys 組件包時會竊取用戶的主機名、用戶名、工作目錄、IP地址等信息并發送到攻擊者可控的服務器地址。 MPS編號MPS-wkyd-5v7r處置建議強烈建議修復發現時間2025-07-02投毒倉庫npm…

Python爬蟲實戰:研究httplib2庫相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡上的信息量呈爆炸式增長。如何從海量的網頁中高效地獲取有價值的數據,成為了當前信息技術領域的一個重要研究課題。網絡爬蟲作為一種自動獲取互聯網信息的程序,能夠按照一定的規則,自動地抓取網頁內容并提取和整理信…

【C++】簡單學——模板初階

模板(template) 泛型編程,讓編譯器把我們不想干的事情給干了 類似于typedef,解決了typedef使用不方便地原因(雖然看似寫少了,其實只是編譯器做多了) 例如: 生成兩個棧,…

X-Search:Spring AI實現的AI智能搜索

X-Search AI智能搜索 X-Search使用Spring AI和Spring AI Alibab Graph實現的AI智能搜索系統。 gitee:https://gitee.com/java-ben/x-search github:https://github.com/renpengben/x-search 核心功能 快速開始 git clone https://github.com/renpengben/x-search.git 1.申請…