劍指offer53_二叉樹的深度

二叉樹的深度


輸入一棵二叉樹的根結點,求該樹的深度。

從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

數據范圍

樹中節點數量 [ 0 , 500 ] [0,500] [0,500]

樣例
輸入:二叉樹[8, 12, 2, null, null, 6, 4, null, null, null, null]如下圖所示:8/ \12  2/ \6   4輸出:3

算法思路

該算法使用遞歸的方式計算二叉樹的最大深度。對于每個節點,其深度等于其左右子樹深度的最大值加1。遞歸的終止條件是遇到空節點,此時深度為0。

  • 時間復雜度:O(n),其中n是二叉樹的節點數。因為需要訪問每個節點一次。
  • 空間復雜度:O(h),其中h是二叉樹的高度。遞歸棧的深度取決于樹的高度,最壞情況下(樹退化為鏈表)為O(n),平均情況下(平衡二叉樹)為O(log n)。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:int treeDepth(TreeNode* root) {// 遞歸終止條件:當前節點為空,深度為0if(!root) return 0;// 遞歸計算左右子樹的深度,取最大值加1作為當前節點的深度return max(treeDepth(root->left), treeDepth(root->right)) + 1;}
};
示例演示
示例1:平衡二叉樹
輸入:3/ \9  20/  \15   7執行過程:
1. treeDepth(3)- treeDepth(9)1- treeDepth(20)- treeDepth(15)1- treeDepth(7)1- max(1, 1) + 1 = 2- max(1, 2) + 1 = 3輸出: 3
示例2:左斜樹
輸入:1/2/3執行過程:
1. treeDepth(1)- treeDepth(2)- treeDepth(3)1- treeDepth(NULL)0- max(1, 0) + 1 = 2- treeDepth(NULL)0- max(2, 0) + 1 = 3輸出: 3
示例3:空樹
輸入: NULL執行過程:
直接返回0輸出: 0

擴展
優化1:迭代實現(BFS)

使用廣度優先搜索(BFS)來計算樹的深度,避免遞歸棧的開銷。

int treeDepth(TreeNode* root) {if (!root) return 0;queue<TreeNode*> q;q.push(root);int depth = 0;while (!q.empty()) {int size = q.size();depth++;for (int i = 0; i < size; i++) {TreeNode* node = q.front();q.pop();if (node->left) q.push(node->left);if (node->right) q.push(node->right);}}return depth;
}

特點

  • 空間復雜度:O(n),最壞情況下隊列中存儲所有葉子節點
  • 適合深度較大的樹,避免遞歸棧溢出
優化2:迭代實現(DFS)

使用深度優先搜索(DFS)的迭代版本,模擬遞歸過程。

int treeDepth(TreeNode* root) {if (!root) return 0;stack<pair<TreeNode*, int>> st;st.push({root, 1});int maxDepth = 0;while (!st.empty()) {auto [node, depth] = st.top();st.pop();maxDepth = max(maxDepth, depth);if (node->right) st.push({node->right, depth + 1});if (node->left) st.push({node->left, depth + 1});}return maxDepth;
}

特點

  • 空間復雜度:O(h),h為樹高
  • 更接近遞歸的思路,但使用顯式棧
方法時間復雜度空間復雜度適用場景
原始遞歸O(n)O(h)代碼簡潔,容易理解
BFS迭代O(n)O(n)適合廣度較大的樹
DFS迭代O(n)O(h)更接近遞歸的思路
  1. 遞歸方法:代碼簡潔,適合大多數場景,但需要注意遞歸深度限制
  2. BFS迭代:適合需要層次遍歷信息的場景,或擔心遞歸棧溢出時
  3. DFS迭代:適合需要模擬遞歸過程的場景,空間效率優于BFS

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

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

相關文章

探秘AI的秘密:leaked-system-prompts

揭秘:揭秘系統提示合集背后的秘密 在當今這個人工智能技術迅速發展的時代,了解和使用大型語言模型(LLM)已成為技術愛好者、開發者和研究人員的共同目標。而作為核心組成部分,系統提示(system prompts)的設計和應用直接影響了LLM的表現和功能。今天, 我們將為大家揭示一…

Gaming Mode四大功能(VRR、QMS、QFT、ALLM)

HDMI 2.1定義的Gaming Mode四大功能&#xff08;VRR、QMS、QFT、ALLM&#xff09;通過協同優化幀傳輸、刷新率同步與延遲控制&#xff0c;顯著提升了游戲和影音的流暢性與響應速度。以下是這些功能的詳細解析及其應用價值&#xff1a; &#x1f504; 1. 可變刷新率&#xff08;…

數據庫總結(關系代數-函數依賴-范式)

以下是關系代數中基本操作的詳細說明&#xff1a; 并&#xff08;Union&#xff09; 關系R和S的并操作表示為R ∪ S&#xff0c;要求R和S具有相同的屬性集&#xff08;并相容性&#xff09;。結果包含所有屬于R或S的元組&#xff0c;自動去除重復項。 示例&#xff1a; R …

react經驗:在nextjs中使用motion組件

什么是motion組件&#xff1f; 一種動畫組件 motion組件文檔 在nextjs中的應用步驟 1.安裝motion npm i framer-motion2.在next.config.js中配置轉義 export default {transpilePackages: [framer-motion] }3.開始應用 **注意要點&#xff1a;**在服務端渲染不可直接用&am…

怎樣大語言模型 遵守規則

如何讓應用中的提示工程更能適應未來變化 目錄 如何讓應用中的提示工程更能適應未來變化怎樣大語言模型 遵守規則提示詞 很有效:Memorize these rules提示可分為穩定組件和易變組件怎樣大語言模型 遵守規則 實驗背景:讓大語言模型可靠地遵守規則很難,尤其是規則數量增多時。…

如何通過SSL證書配置防止源站IP泄露 - 全面防護指南

問題背景&#xff1a;SSL證書如何導致源站IP泄露 近期多位站長反饋&#xff0c;即使已部署高防CDN并做好源站IP保密工作&#xff0c;服務器仍頻繁遭受DDoS攻擊。經深入排查&#xff0c;發現問題根源在于SSL證書。當前網絡環境中存在大量爬蟲工具24小時不間斷掃描全網IP地址&am…

醫院信息化發展要經過哪幾個階段

目前&#xff0c;幾乎所有的醫院都離不開信息技術的建設和支持。沒有信息技術&#xff0c;醫院的業務可能無法繼續。醫院信息化的發展主要經歷三個階段&#xff0c;即醫院管理信息化階段、臨床管理信息化階段和醫療智能化階段。從基礎設施的角度來看&#xff0c;每個階段都有不…

【Vscode】Vscode切換成中文語言

安裝中文語言包 啟動 VSCode。按下Ctrl Shift X&#xff08;或者點擊左側邊欄的擴展圖標&#xff09;&#xff0c;打開擴展面板。在搜索框中輸入Chinese (Simplified)&#xff0c;在搜索結果里找到Chinese (Simplified) Language Pack for Visual Studio Code并點擊安裝按鈕…

【百日精通JAVA | 數據結構篇】 一文了解泛型體系

一、初識泛型 在推出泛型以前&#xff0c;程序員可以創建一個元素類型Object的集合&#xff0c;該集合能夠存儲任意的數據類型對象&#xff0c;而在使用該集合的過程中&#xff0c;需要明確知道存儲每個元素的類型&#xff0c;否則容易引發ClassCastException異常。 泛型是JD…

賦能 Java 工程,飛算科技重新定義智能開發

在數字經濟蓬勃發展的當下&#xff0c;軟件開發行業正經歷著前所未有的變革。飛算科技作為一家自主創新型的數字科技公司&#xff0c;始終以互聯網科技、大數據、人工智能等前沿技術為根基。憑借團隊在相關領域多年積累的深厚實踐經驗&#xff0c;公司深度融合技術與應用&#…

【藍牙】Linux Qt4藍牙設備列表刷新加載采用什么策略,使用什么對應的Linux命令或dbus接口

在 Linux 系統中&#xff0c;使用 Qt4 開發藍牙設備列表刷新功能時&#xff0c;通常會結合 BlueZ 藍牙協議棧 和 D-Bus 通信機制 實現對藍牙設備的發現與管理。以下是常見的實現策略和對應的命令或接口。 &#x1f9e9; 一、藍牙設備列表刷新策略 1. 主動掃描&#xff08;Scan…

產品背景知識——CIFS、SMB 和 Samba

產品背景知識——CIFS、SMB 和 Samba 1. SMB&#xff08;Server Message Block&#xff09; 定義&#xff1a; SMB 是一種網絡協議&#xff0c;用于在計算機之間共享文件、打印機、串口等資源。它由 IBM 在 1980 年代開發&#xff0c;后被微軟采用并擴展。 發展歷程&#xff…

基于Python的GIS-RS多源數據處理(TIF/SHP/NC/...)【20250630】

柵格數據以規則網格(像素)的數值矩陣表達地理現象&#xff0c;每個單元格代表一個屬性值(如高程、溫度)。例如衛星影像、數字高程模型、溫度分布圖。存儲格式包括ENVI DAT、GeoTIFF、JPEG、PNG、ASCII Grid等等。 矢量數據是通過幾何圖形(點、線、面)表示地理實體&#xff0c;…

基于yolov5的深度學習的昆蟲檢測帶QT界面

完整項目查看或想了解其他項目點擊文末名片 項目簡介 本項目旨在開發一個基于深度學習的昆蟲檢測與識別系統。系統使用兩個主要模塊&#xff1a;昆蟲檢測器&#xff08;InsectDetector&#xff09;和昆蟲識別器&#xff08;InsectIdentifier&#xff09;。首先&#xff0c;昆蟲…

linux使用1

1.終端查看ip地址 # windows ipconfig# linux ifconfig2.VMware共享文件夾權限設置下如何復制/移動文件 # 移動: mv # 查看當前文件夾: ls # 設置管理員權限&#xff1a; sudo # 復制&#xff1a; cp#情景一&#xff1a;移動桌面文件夾&#xff08;desktop/day4/server/)到共…

ACE之ACE_NonBlocking_Connect_Handler問題分析

問題 ACE_NonBlocking_Connect_Handler在處理異步時存在問題 分析 當connect選擇的同步參數為ACE_Synch_Options::USE_REACTOR時&#xff0c;連接超時時間為ACE_Time_Value::zero&#xff0c;在同步發起連接返回的錯誤碼為EWOULDBLOCK時&#xff0c;會發起異步連接nonblocki…

『uniapp』i18n 國際化(保姆級圖文)

目錄 預覽效果項目根目錄新建i18n文件夾安裝vue-i18n 指定版本main.js 中引入i18n頁面展示總結歡迎關注 『uniapp』 專欄,持續更新中 歡迎關注 『uniapp』 專欄,持續更新中 預覽效果 中文 英文 項目根目錄新建i18n文件夾 其中各個語言的json文件

P1967 [NOIP 2013 提高組] 貨車運

題目背景 NOIP2013 提高組 D1T3 題目描述 A 國有 n n n 座城市&#xff0c;編號從 1 1 1 到 n n n&#xff0c;城市之間有 m m m 條雙向道路。每一條道路對車輛都有重量限制&#xff0c;簡稱限重。 現在有 q q q 輛貨車在運輸貨物&#xff0c; 司機們想知道每輛車在不…

【軟考高項論文】論信息系統項目的溝通管理

摘要 在信息系統項目的實施進程中&#xff0c;溝通管理的重要性不言而喻。有效的溝通不僅能保證項目信息準確傳遞&#xff0c;還能推動團隊協作&#xff0c;提高項目整體效率。本文結合 2024 年 6 月我所參與的信息系統項目&#xff0c;圍繞項目溝通管理的過程及項目干系人管理…

浪潮和曙光服務器的ipmi配置教程

配置浪潮SA5212M5服務器 1、啟動服務器按DEL按鍵進入服務器bios 2、選擇Server Mgmt菜單中的BMC Network Configuration配置項回車。 3、BMC Network Configuration配置項中的Get BMC Dedicated Parameters選擇Manual&#xff08;手動配置&#xff09; 4、BMC Network Configu…