leetcode題解513:找樹左下角的值(遞歸中的回溯處理)!

一、題目內容:

題目要求找到一個二叉樹的最底層最左邊節點的值。具體來說,我們需要從根節點開始遍歷二叉

樹,找到最深的那層中的最左邊的節點,并返回該節點的值。因為要先找到最底層左側的值,所以我們選擇遍歷順序一定是左側先遍歷,右側后遍歷。

我們需要聲明depth、MaxDepth和result,depth記錄當前深度、MaxDepth記錄最大深度深度、result記錄深度最大值,但在遍歷中我么會思考到,如果遍歷到某一葉子節點,但是當前結點深度并不是最大的,那么遞歸會回退到其父結點,這時就需要將深度回溯,這一過程如何實現呢,我們會在代碼中體現。

二、題目分析

輸入和輸出

  • 輸入:二叉樹的根節點 root

    • 二叉樹的每個節點是一個 TreeNode 對象,包含:

      • val:節點的值(整數)。

      • left:指向左子節點的指針。

      • right:指向右子節點的指針。

  • 輸出:最底層最左邊節點的值(整數)。

深度優先遍歷函數 trevesal

  • 參數

    • root:當前節點。

    • depth:當前節點的深度。

  • 邏輯

    • 如果當前節點是葉子節點(即沒有左子節點和右子節點)則:

      • 如果當前深度 depth 大于 maxDepth,則更新 maxDepthresult

    • 如果當前節點有左子節點則:

      • 遞歸調用 trevesal,深度加1。

    • 如果當前節點有右子節點則:

      • 遞歸調用 trevesal,深度加1。

    • 回溯:在遞歸調用結束后,深度減1,以恢復到當前節點的深度。

三、代碼解答

1.C++代碼

class Solution {
public:int maxDepth = INT_MIN;  // 用于記錄當前找到的最深的葉子節點的深度int result;              // 用于存儲最底層最左邊節點的值// 定義遞歸函數,用于深度優先搜索void trevesal(TreeNode *root, int depth) {// 如果當前節點是葉子節點(沒有左子節點和右子節點)if (root->left == NULL && root->right == NULL) {// 如果當前深度大于已知的最大深度if (depth > maxDepth) {result = root->val;  // 更新結果值為當前節點的值maxDepth = depth;    // 更新最大深度為當前深度}}// 如果當前節點有左子節點if (root->left) {depth++;  // 深度加1,進入下一層trevesal(root->left, depth);  // 遞歸遍歷左子節點depth--;  // 回溯,恢復到當前節點的深度}// 如果當前節點有右子節點if (root->right) {depth++;  // 深度加1,進入下一層trevesal(root->right, depth);  // 遞歸遍歷右子節點depth--;  // 回溯,恢復到當前節點的深度}}// 主函數,用于調用遞歸函數并返回結果int findBottomLeftValue(TreeNode* root) {trevesal(root, 0);  // 從根節點開始,深度為0return result;      // 返回最底層最左邊節點的值}
};

詳細注釋

1. 成員變量
int maxDepth = INT_MIN;  // 初始化為最小整數,表示當前找到的最深的葉子節點的深度
int result;              // 用于存儲最底層最左邊節點的值
  • maxDepth:記錄當前找到的最深的葉子節點的深度,初始值為 INT_MIN,確保任何葉子節點的深度都會比它大。

  • result:存儲最底層最左邊節點的值,初始值未定義,會在遞歸過程中被賦值。

2. 遞歸函數?trevesal
void trevesal(TreeNode *root, int depth) {// 如果當前節點是葉子節點(沒有左子節點和右子節點)if (root->left == NULL && root->right == NULL) {// 如果當前深度大于已知的最大深度if (depth > maxDepth) {result = root->val;  // 更新結果值為當前節點的值maxDepth = depth;    // 更新最大深度為當前深度}}// 如果當前節點有左子節點if (root->left) {depth++;  // 深度加1,進入下一層trevesal(root->left, depth);  // 遞歸遍歷左子節點depth--;  // 回溯,恢復到當前節點的深度}// 如果當前節點有右子節點if (root->right) {depth++;  // 深度加1,進入下一層trevesal(root->right, depth);  // 遞歸遍歷右子節點depth--;  // 回溯,恢復到當前節點的深度}
}
  • 葉子節點檢查

    • 如果當前節點沒有左子節點和右子節點,說明它是一個葉子節點。

    • 如果當前葉子節點的深度大于已知的最大深度 maxDepth,則更新 resultmaxDepth

  • 遞歸遍歷左子節點

    • 如果當前節點有左子節點,深度加1,遞歸調用 trevesal 遍歷左子節點。

    • 遞歸返回后,深度減1,恢復到當前節點的深度。這是回溯的關鍵步驟,確保每次遞歸返回后,深度值正確。

  • 遞歸遍歷右子節點

    • 如果當前節點有右子節點,深度加1,遞歸調用 trevesal 遍歷右子節點。

    • 遞歸返回后,深度減1,恢復到當前節點的深度。同樣,這是回溯的關鍵步驟。

3. 主函數?findBottomLeftValue
int findBottomLeftValue(TreeNode* root) {trevesal(root, 0);  // 從根節點開始,深度為0return result;      // 返回最底層最左邊節點的值
}
  • 調用遞歸函數

    • 從根節點開始,初始深度為0,調用 trevesal 函數。

  • 返回結果

    • 遞歸完成后,返回 result,即最底層最左邊節點的值。

回溯和遞歸的詳細解釋

遞歸
  • 遞歸是一種函數調用自身的方法,用于解決復雜問題。在本題中,遞歸用于遍歷二叉樹的每個節點。

  • 每次遞歸調用時,深度 depth 增加1,表示進入下一層。

  • 遞歸調用的終止條件是當前節點是葉子節點(沒有左子節點和右子節點)。

回溯
  • 回溯是一種在遞歸調用返回后恢復狀態的機制。

  • 在本題中,每次遞歸調用返回后,深度 depth 減1,恢復到當前節點的深度。

  • 這樣可以確保每次遞歸返回后,深度值正確,不會影響后續的遞歸調用。

示例

假設二叉樹如下:

    1/ \2   3/   / \
4   5   6
遍歷過程
  1. 從根節點 1 開始,深度為0。

    • 調用 trevesal(1, 0)

  2. 遍歷左子節點 2,深度為1。

    • 調用 trevesal(2, 1)

  3. 遍歷左子節點 4,深度為2。

    • 調用 trevesal(4, 2)

    • 4 是葉子節點,且深度大于 maxDepth,更新 maxDepth=2result=4

    • 返回到節點 2,深度減1,恢復為1。

  4. 返回到根節點 1,深度減1,恢復為0。

  5. 遍歷右子節點 3,深度為1。

    • 調用 trevesal(3, 1)

  6. 遍歷左子節點 5,深度為2。

    • 調用 trevesal(5, 2)

    • 5 是葉子節點,但深度等于 maxDepth,不更新。

    • 返回到節點 3,深度減1,恢復為1。

  7. 遍歷右子節點 6,深度為2。

    • 調用 trevesal(6, 2)

    • 6 是葉子節點,但深度等于 maxDepth,不更新。

    • 返回到節點 3,深度減1,恢復為1。

  8. 返回到根節點 1,深度減1,恢復為0。

最終,result=4,即最底層最左邊的節點值。

總結

通過遞歸和回溯,代碼能夠有效地找到二叉樹最底層最左邊的節點值。遞歸用于遍歷二叉樹,回溯用于恢復狀態,確保每次遞歸返回后,深度值正確。

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

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

相關文章

C#面試問題41-60

41. What is the Singleton design pattern? Singleton is a class that only allows creating a single instance of itselt. 單例設計模式是一個類,它只允許創建自己的單個實例。 構造函數防止他在單例類以外的地方被調用。 使用情景:need a sing…

筆記思考法

掌握麥肯錫流筆記術,對大家來說有以下幾種好處: 1) 可以將自己的思考可視化,使之變得更加清晰 2) 避免無用功 3) 經常能夠提出有創意的想法 4) 遇到問題時能夠及時找到解決辦法 5) 不管面對什么情況都能夠找出真正有效的解決辦法 為什么僅僅通過改變使用…

Rust 學習筆記:關于閉包的練習題

Rust 學習筆記:關于閉包的練習題 Rust 學習筆記:關于閉包的練習題問題 1問題 2以下程序能否通過編譯?若能,輸出是?以下程序能否通過編譯?若能,輸出是?考慮該 API,空白處填…

(一)微服務(垂直AP/分布式緩存/裝飾器Pattern)

文章目錄 項目地址一、創建第一個垂直API1.1 創建Common層1. ICommand接口2. IQuery接口 1.2 創建API1. 實體2. Handler3. endpoint 1.3 使用Marten作為ORM 二、Redis緩存2.1 使用緩存裝飾器1. 創建裝飾器2. 注冊裝飾器 2.2 創建docker-compose1. docker-compose2. docker-comp…

Spring AI系列之使用 Spring AI 轉錄音頻文件(基于OpenAI)

概述 企業常常需要從各種類型的音頻內容中提取有價值的數據,例如:將客戶支持通話轉錄用于情感分析、為視頻生成字幕,或整理會議紀要。然而,手動轉錄音頻文件既耗時又昂貴。 為了解決這一問題,OpenAI 提供了強大的語…

室內VR全景助力房產營銷及裝修

在當今的地產行業,VR全景已成為不可或缺的應用工具。從地產直播到樓市VR地圖,從效果圖到水電家裝施工記錄,整個地產行業的上下游生態中,云VR全景的身影無處不在。本文將探討VR全景在房產營銷及裝修領域的應用,并介紹眾…

Sentinel限流熔斷機制實戰

1、核心概念 1.1、流量控制 流量控制是為了 防止系統被過多的請求壓垮,確保資源合理分配并保持服務的可用性,比如對請求數量的限制。 流量控制的 3 個主要優勢: 防止過載:當瞬間涌入的請求量超出系統處理能力時,會…

深度解析 torch.mean 的替代方案

torch.mean 是什么意思 代碼效果解釋 segment_vector = torch.mean(segment_embedding, dim=1) # [1, hidden_dim] 這行代碼的作用是在指定維度上對張量 segment_embedding 求平均值,實現類似平均池化的效果。 具體來說,dim=1 表示沿著索引為1的維度進行操作。假設 segment…

Paraformer語音模型:一種語音模型加速方法

隨著智能語音技術的普及,語音識別(ASR)、語音合成(TTS)、聲紋識別等應用場景對模型推理效率提出了極高要求,本文介紹將Paraformer語音模型從預訓練模型導出為ONNX格式,并使用ONNX Runtime進行推…

本地部署FreeGPT+內網穿透公網遠程訪問,搞定ChatGPT外網訪問難題

?FreeGPT?是一個基于GPT 3.5/4的ChatGPT聊天網頁用戶界面,提供了一個開放的聊天界面,開箱即用?。ChatGPT是非常熱門的,但訪問體驗一直不太理想。為了解決這一問題,出現了各類方法和工具,其中FreeGPT是一款非常實用的…

ElasticSearch遷移至openGauss

Elasticsearch 作為一種高效的全文搜索引擎,廣泛應用于實時搜索、日志分析等場景。而 openGauss,作為一款企業級關系型數據庫,強調事務處理與數據一致性。那么,當這兩者的應用場景和技術架構發生交集時,如何實現它們之…

品優購項目(HTML\CSS)

項目效果可訪問 http://zhousunyu.3vdo.club 查看 主頁 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

因泰立科技:鐳眸T51激光雷達,打造智能門控新生態

在高端門控行業&#xff0c;安全與效率是永恒的追求。如今&#xff0c;隨著科技的飛速發展&#xff0c;激光雷達與TOF相機技術的融合&#xff0c;為門控系統帶來了前所未有的智能感知能力&#xff0c;開啟了精準守護的新時代。因泰立科技的鐳眸T51激光雷達&#xff0c;作為這一…

MyBatisPlus--快速入門

MyBatisPlus介紹 從名字中就可以感覺到MybatisPlus與MyBatis之間的淵源&#xff0c;而MyBatis是一個非常流行的持久層框架&#xff0c;主要來做數據庫的增刪改查&#xff0c;而MyBatisPlus這種命名方式讓人不得不往MyBatis的升級版去聯想&#xff0c;事實也確實如此&#xff0…

redis持久化策略

RDB 是通過生成數據快照來實現持久化的&#xff0c;相當于給內存中的數據拍一張"照片"保存到磁盤上。AOF 記錄所有寫操作命令&#xff0c;以Redis協議格式追加到文件末尾。 RDB 在滿足特定條件時觸發內存快照&#xff0c;生成新的RDB文件替換舊文件 AOF 先寫入內…

Spring Boot中使用@JsonAnyGetter和@JsonAnySetter處理動態JSON屬性

Spring Boot 中使用 @JsonAnyGetter 和 @JsonAnySetter 處理動態 JSON 屬性 在實際的后端開發中,尤其是使用 Spring Boot 構建 API 時,我們經常會遇到需要處理動態 JSON 屬性的場景。例如,前端傳遞過來的 JSON 數據結構不固定,或者業務需求變更頻繁,導致實體類無法預先定…

拉取gitlab項目

一、下載nvm管理node 先下載配置好nvm,再用nvm下載node 下載鏈接&#xff1a;開始 下載nvm - nvm中文官網 情況&#xff1a;npm i 下載依賴緩慢&#xff0c;可能是node版本不對&#xff0c;可能node版本太高 可能得問題&#xff1a;使用nvm 下載低版本的node時&#xff0c;…

【解決辦法】ubuntu重啟不起來,輸入用戶名和密碼進不去,又重新返回登錄頁。

項目場景&#xff1a; ubuntu重啟不起來&#xff0c;輸入用戶名和密碼進不去&#xff0c;又重新返回登錄頁。 問題描述 在華碩天選一代筆記本上面安裝了ubuntu22.04.5桌面版&#xff0c;但是重啟以后出現&#xff0c;輸入了用戶名和密碼&#xff0c;等待一會還讓輸入用戶名和…

# 云端大模型:智能時代的新引擎

云端大模型&#xff1a;智能時代的新引擎 在人工智能技術的迅猛發展中&#xff0c;云端大模型扮演著至關重要的角色。它們不僅推動了技術的邊界&#xff0c;也為各行各業帶來了前所未有的機遇。本文將結合一系列圖片和代碼示例&#xff0c;深入探討云端大模型的功能、應用及其…

(1)pytest簡介和環境準備

1. pytest簡介 pytest是python的一種單元測試框架&#xff0c;與python自帶的unittest測試框架類似&#xff0c;但是比unittest框架使用起來更簡潔&#xff0c;效率更高。根據pytest的官方網站介紹&#xff0c;它具有如下特點&#xff1a; 非常容易上手&#xff0c;入門簡單&a…