leetcode513.找樹左下角的值:遞歸深度優先搜索中的最左節點追蹤之道

一、題目本質與核心訴求解析

在二叉樹算法問題中,"找樹左下角的值"是一個典型的結合深度與位置判斷的問題。題目要求我們找到二叉樹中最深層最左邊的節點值,這里的"左下角"有兩個關鍵限定:

  • 深度優先:必須是深度最大的那一層節點
  • 最左優先:在最深層中選擇最左邊的那個節點

先來看一個示例二叉樹:

    1/ \2   3/   / \
4   5   6/7

在這個樹中,最深層是第3層(根節點為第0層時是第2層),該層最左節點是7,因此正確輸出為7。理解這個問題的核心在于如何在遞歸過程中同時追蹤節點深度和左右位置關系,這也是本文要重點解析的內容。

二、遞歸解法的核心實現與數據結構設計

完整遞歸代碼實現

/*** 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 {private int Deep = -1;  // 記錄當前最大深度private int res = 0;    // 記錄最深層最左節點值public int findBottomLeftValue(TreeNode root) {findLeftVal(root, 0);  // 從根節點開始,深度初始為0return res;}public void findLeftVal(TreeNode root, int deep) {if (root == null) {return;}// 處理葉子節點:判斷是否更新最深層最左節點if (root.left == null && root.right == null) {if (deep > Deep) {res = root.val;Deep = deep;}return;}// 先遞歸左子樹,保證左子樹優先訪問if (root.left != null) {findLeftVal(root.left, deep + 1);}// 再遞歸右子樹if (root.right != null) {findLeftVal(root.right, deep + 1);}}
}

關鍵數據結構設計解析

  1. Deep變量

    • 作用:記錄當前發現的最大深度
    • 初始值:-1(因為根節點深度從0開始,確保第一個葉子節點會更新該值)
    • 更新時機:當遇到更深的葉子節點時更新
  2. res變量

    • 作用:存儲最深層最左節點的值
    • 更新原則:僅當遇到更深的葉子節點,或者同深度但更左的葉子節點時更新(由于先左后右遞歸,同深度下左節點必然先訪問)
  3. deep參數

    • 作用:當前遞歸層的節點深度
    • 傳遞方式:每次遞歸進入子節點時深度+1
    • 意義:明確當前節點在樹中的層級位置

三、核心問題解析:遞歸中如何判斷最深層最左節點

1. 深度優先搜索的順序控制

本算法采用先左后右的深度優先搜索順序,這是確保找到"最左"節點的關鍵:

  • 遞歸調用順序:先處理左子樹,再處理右子樹
  • 核心邏輯:在同一深度下,左子樹的節點會比右子樹的節點先被訪問
  • 效果:當存在多個同深度節點時,左節點會優先被判定為當前最深層最左節點

2. 深度判斷與更新機制

if (root.left == null && root.right == null) {if (deep > Deep) {res = root.val;Deep = deep;}
}
  • 葉子節點判斷:當節點左右子樹都為空時,確定為葉子節點
  • 深度比較:如果當前葉子節點深度大于已記錄的最大深度Deep,則更新結果
  • 更新策略
    1. 更深的葉子節點:直接更新res和Deep
    2. 同深度的葉子節點:由于先左后右遞歸,左節點先訪問,res不會被右節點覆蓋

3. 遞歸終止與回溯邏輯

  • 終止條件
    1. 遇到空節點時直接返回(遞歸邊界)
    2. 處理完葉子節點后返回(不再繼續遞歸)
  • 回溯作用:當左子樹遞歸完成后,回溯到父節點,再進入右子樹遞歸,確保左右子樹都被遍歷

四、遞歸流程深度模擬:以示例二叉樹為例

示例二叉樹結構(根節點深度為0):

    1(0)/   \2(1)  3(1)/     / \
4(2)  5(2) 6(2)/7(3)

詳細遞歸執行過程

  1. 初始狀態

    • Deep = -1, res = 0
    • 調用findLeftVal(root, 0),root為節點1,深度0
  2. 處理節點1(深度0)

    • 非葉子節點,進入左子樹調用findLeftVal(2, 1)
  3. 處理節點2(深度1)

    • 非葉子節點,進入左子樹調用findLeftVal(4, 2)
  4. 處理節點4(深度2)

    • 是葉子節點(左右子樹為空)
    • 深度2 > Deep(-1),更新res=4, Deep=2
    • 返回上一層(節點2)
  5. 節點2的右子樹為空,返回上一層(節點1)

  6. 節點1進入右子樹調用findLeftVal(3, 1)

  7. 處理節點3(深度1)

    • 非葉子節點,進入左子樹調用findLeftVal(5, 2)
  8. 處理節點5(深度2)

    • 非葉子節點,進入左子樹調用findLeftVal(7, 3)
  9. 處理節點7(深度3)

    • 是葉子節點
    • 深度3 > Deep(2),更新res=7, Deep=3
    • 返回上一層(節點5)
  10. 節點5的右子樹為空,返回上一層(節點3)

  11. 節點3進入右子樹調用findLeftVal(6, 2)

  12. 處理節點6(深度2)

    • 是葉子節點
    • 深度2 < Deep(3),不更新res
    • 返回上一層(節點3)
  13. 所有遞歸結束,返回res=7

五、算法復雜度與遞歸特性分析

1. 時間復雜度分析

  • O(n):每個節點僅被訪問一次,n為樹的節點總數
  • 原因:遞歸過程中對每個節點進行一次深度判斷,無重復訪問

2. 空間復雜度分析

  • O(h):h為樹的高度,取決于遞歸棧的最大深度
  • 最壞情況:樹退化為鏈表時,h=n,空間復雜度O(n)
  • 平均情況:平衡二叉樹h=logn,空間復雜度O(logn)

3. 遞歸算法的優勢與局限

優勢局限
代碼邏輯簡潔,符合樹的遞歸定義可能因棧溢出無法處理極大樹
天然支持深度優先搜索順序控制空間復雜度與樹深度相關
先左后右的遞歸順序自然實現"最左"優先調試相比迭代更困難

六、核心技術點總結:遞歸找最左節點的三大關鍵

1. 深度優先搜索順序控制

  • 先左后右的遞歸順序是實現"最左"優先的核心
  • 遞歸天然保證左子樹先于右子樹處理,確保同深度下左節點優先被訪問

2. 深度追蹤與比較機制

  • 通過參數傳遞當前深度,全局變量記錄最大深度
  • 葉子節點處進行深度比較,確保只保留最深層節點

3. 優先更新策略

  • 深度更大時:無條件更新結果
  • 深度相同時:由于左子樹先處理,結果不會被右節點覆蓋
  • 實現了"深度優先,同深度左優先"的判定邏輯

七、拓展思考:遞歸與迭代解法的對比與適用場景

1. 與層序遍歷迭代法的對比

方法核心思想時間復雜度空間復雜度優勢場景
遞歸深度優先+先左后右O(n)O(h)代碼簡潔、樹深度較小
迭代廣度優先+層序處理O(n)O(m)(m為最大層寬度)處理極大樹、避免棧溢出

2. 大廠面試中的策略建議

  • 當樹深度較小時,遞歸解法更簡潔高效
  • 當樹可能很深時,應考慮迭代解法避免棧溢出
  • 面試中可先給出遞歸解法,再主動說明迭代優化方向

八、總結:遞歸解法的核心設計哲學

本遞歸算法通過"深度優先搜索+先左后右順序+深度追蹤"的組合策略,巧妙解決了找樹左下角值的問題。其核心設計哲學包括:

  1. 深度優先的天然優勢:遞歸天然適合深度優先搜索,能自然追蹤節點深度
  2. 順序控制的重要性:先左后右的遞歸順序是實現"最左"優先的關鍵
  3. 狀態傳遞的巧妙設計:通過參數傳遞深度,全局變量記錄結果,實現狀態追蹤
  4. 葉子節點的關鍵作用:僅在葉子節點處判斷是否更新結果,提高算法效率

理解這種遞歸設計思路,不僅能解決本題,還能為類似的二叉樹深度與位置相關問題提供通用解法。在實際應用中,可根據樹的規模和場景選擇遞歸或迭代實現,靈活應對不同需求。

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

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

相關文章

Python入門手冊:Python基礎語法

Python是一種簡潔、易讀且功能強大的編程語言&#xff0c;非常適合初學者入門。無論你是編程新手&#xff0c;還是有一定編程基礎但想學習Python的開發者&#xff0c;掌握Python的基礎語法都是邁向高效編程的第一步。本文將詳細介紹Python的基本語法&#xff0c;包括變量和數據…

postgresql 常用參數配置

#01 - Connection-Authentication 優化點&#xff1a; listen_addresses 0.0.0.0 建議&#xff1a;生產環境應限制為具體IP&#xff08;如 192.168.1.0/24,127.0.0.1&#xff09;&#xff0c;避免暴露到公網。 ssl off 建議&#xff1a;啟用SSL&#xff08;ssl on&#xf…

POI模板生成EXCEL 64000 style in a .xlsx Workbook

業務場景&#xff1a; 項目需要生成多個EXCEL表格&#xff0c;每個表格根據數據列表的大小動態增加Excel的行數&#xff0c;要保證新插入行的樣式與模板完全一致 考慮使用以下方法保證樣式的統一 cloneStyleFrom(templateStyle); 但是由于數據量比較大&#xff0c;拋出如下的…

HJ106 字符逆序【牛客網】

文章目錄 零、原題鏈接一、題目描述二、測試用例三、解題思路四、參考代碼 零、原題鏈接 HJ106 字符逆序 一、題目描述 二、測試用例 三、解題思路 基本思路&#xff1a; ??考慮到可能會有多個空格&#xff0c;使用使用 getline 函數直接讀取一行。 ??如果可以直接打印的…

CI/CD的演進之路

CI/CD的演進之路 一、CI/CD的成長演變 早期起源與初步實踐&#xff1a;CI/CD的概念可以追溯到軟件開發的早期階段&#xff0c;但真正開始受到關注是在敏捷開發方法興起之后。在傳統的瀑布模型開發模式下&#xff0c;軟件開發周期長、發布頻率低&#xff0c;更新往往需要數月甚…

制作一款打飛機游戲55:擴散

子彈模式 ?瘋狂的子彈地獄?&#xff1a; 嘿&#xff0c;伙計們&#xff0c;今天我們要創造一些令人印象深刻的子彈模式。這就是所謂的“子彈地獄”&#xff01; ?問題與挑戰?&#xff1a; 在之前的開發中&#xff0c;我們遇到了一些問題。特別是關于如何處理子彈的角度問題…

Vortex GPGPU的github流程跑通與功能模塊波形探索(三)

文章目錄 前言一、./build/ci下的文件結構二、基于驅動進行仿真過程牽扯的文件2.1 blackbox.sh文件2.2 demo文件2.3 額外牽扯到的ramulator2.3.1 ramulator簡單介紹2.3.2 ramulator使用方法2.3.3 ramulator的輸出2.3.4 ramulator的復現2.3.4.1 調試與驗證&#xff08;第 4.1 節…

公有云AWS基礎架構與核心服務:從概念到實踐

??「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 (初學者技術專欄) 一、基礎概念 定義:AWS(Amazon Web Services)是亞馬遜提供的云計算服務,包含計算、存儲、網絡、數據庫等核心能力,通過全球數據中心為用戶提供靈活…

wsl2 不能聯網

wsl2 安裝后用 wifi 共享是能聯網&#xff0c;問題出在公司網絡限制 wsl2 IP 訪問網絡&#xff0c;但是主機可以上網。 解決辦法&#xff0c;在主機用 nginx 設置代理&#xff0c;可能需要開端口權限 server {listen 9000;server_name localhost;location /ubuntu/ {#…

HarmonyOS鴻蒙應用規格開發指南

在鴻蒙生態系統中&#xff0c;應用規格是確保應用符合系統要求的基礎。本文將深入探討鴻蒙應用的規格開發實踐&#xff0c;幫助開發者打造符合規范的應用。 應用包結構規范 1. 基本配置要求 包結構規范 符合規范的應用包結構正確的HAP配置文件完整的應用信息 示例配置&…

異步日志分析:MongoDB與FastAPI的高效存儲揭秘

title: 異步日志分析:MongoDB與FastAPI的高效存儲揭秘 date: 2025/05/22 17:04:56 updated: 2025/05/22 17:04:56 author: cmdragon excerpt: MongoDB與FastAPI集成構建日志分析系統,通過Motor驅動實現異步操作,提升數據處理效率。使用Pydantic進行數據驗證,配置環境變量…

[原理理解] 超分使用到的RAM模型和LLAVA模型

文章目錄 前述RAM 模型介紹LLAVA 模型介紹 前述 最近在研究基于diffusion的超分模型&#xff0c;發現基本都文本編碼的時候都需要用到RAM模型或者LLAVA模型&#xff0c;兩個有什么區別呢&#xff1f; RAM 模型介紹 RAM&#xff08;Recognize Anything Model&#xff09; 是用…

基于 SpringBoot + Vue 的海濱體育館管理系統設計與實現

一、項目概述 本項目是一套基于SpringBoot Vue技術棧開發的海濱體育館管理系統&#xff0c;旨在幫助管理者更高效地管理體育館的各項資源和活動&#xff0c;同時也為學生提供方便的借還器材、預約活動等功能。系統采用了前后端分離的架構&#xff0c;后端使用Spring Boot框架…

【時時三省】(C語言基礎)對被調用函數的聲明和函數原型

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 在一個函數中調用另一個函數&#xff08;即被調用函數&#xff09;需要具備如下條件 ( 1 )首先被調用的函數必須是已經定義的函數(是庫函數或用戶自己定義的函數)&#xff0c;但僅有這一條件…

微軟宣布的五大重要事項|AI日報0520

微軟宣布的五大重要事項 在 Build 大會上&#xff0c;微軟向大家展示了微軟如何構建開放的智能體網絡。它正在重塑技術棧的每一層&#xff0c;微軟的目標是幫助每一位開發者構建能夠賦能世界各地的人們和組織的應用與智能體。消息來源 詳細了解 以下是微軟宣布的五大重要事項…

三、【數據建模篇】:用 Django Models 構建測試平臺核心數據

【數據建模篇】&#xff1a;用 Django Models 構建測試平臺核心數據 前言我們要設計哪些核心數據&#xff1f;準備工作&#xff1a;創建 Django App開始設計數據模型 (Models)1. 通用基礎模型 (可選但推薦)2. 項目模型 (Project)3. 模塊模型 (Module)4. 測試用例模型 (TestCase…

centos原系統安裝了Python3.7.9兼用在安裝一個python3.8

系統有個3.7.9版本的python 但是會遇到錯誤 usr/local/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1050: InsecureRequestWarning: Unverified HTTPS request is being made to host ‘www.xxx.com’. Adding certificate verification is strongly advi…

道可云人工智能每日資訊|浙江省人民政府印發《關于支持人工智能創新發展的若干措施》

道可云元宇宙每日簡報&#xff08;2025年5月21日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 浙江省人民政府印發《關于支持人工智能創新發展的若干措施》 為搶占人工智能發展制高點&#xff0c;打造全球人工智能創新發展高地&#xff0c;浙江省人民政府于近日…

OpenGL ES 基本基本使用、繪制基本2D圖形

OpenGL ES 繪制基礎圖形 OpenGL ES基本概念 OpenGL ES (Embedded-System) 是專為嵌入式設備&#xff08;如手機、平板、VR 設備&#xff09;設計的圖形 API&#xff0c;是 OpenGL 的輕量級版本。 &#xff5c;下面是一個Android使用 OpenGL ES的基本框架 MainActivity 設置一…

JavaScript進階(十二)

第三部分:JavaScript進階 目錄 第三部分:JavaScript進階 十二、深淺拷貝 12.1 淺拷貝 12.2 深拷貝 1. 通過遞歸實現深拷貝 2. js庫lodash里面cloneDeep內部實現了深拷貝 3. 通過JSON.stringify()實現 十三、異常處理 13.1 throw拋異常 13.2 try /catch捕獲異常 1…