【LeetCode Solutions】LeetCode 熱題 100 題解(36 ~ 40)

CONTENTS

  • 二叉樹 - LeetCode 94. 二叉樹的中序遍歷(簡單)
  • 二叉樹 - LeetCode 104. 二叉樹的最大深度(簡單)
  • 二叉樹 - LeetCode 226. 翻轉二叉樹(簡單)
  • 二叉樹 - LeetCode 101. 對稱二叉樹(簡單)
  • 二叉樹 - LeetCode 543. 二叉樹的直徑(簡單)

二叉樹 - LeetCode 94. 二叉樹的中序遍歷(簡單)

【題目描述】

給定一個二叉樹的根節點 root,返回它的中序遍歷。

【示例 1】

在這里插入圖片描述

輸入:root = [1,null,2,3]
輸出:[1,3,2]

【示例 2】

輸入:root = []
輸出:[]

【示例 3】

輸入:root = [1]
輸出:[1]

【提示】

樹中節點數目在范圍 [0,100][0, 100][0,100]
?100<=Node.val<=100-100 <= Node.val <= 100?100<=Node.val<=100

進階:遞歸算法很簡單,你可以通過迭代算法完成嗎?


【分析】

遞歸遍歷二叉樹非常簡單,不理解的可以看樹和圖的遍歷方式詳解:【UCB CS 61B SP24】Lecture 22 & 23: Tree and Graph Traversals, DFS, BFS。

本題的 Tips 中提到嘗試用迭代算法完成,那么分析一下如何不用遞歸實現中序遍歷。

對于每個節點,如果其左子樹存在,就需要先遍歷左子樹,但是當前點也不能扔掉,因為遍歷完左子樹還要回來遍歷當前節點,因此如果當前節點有左子樹就先將當前點壓入棧中。

如果當前節點的左子樹已經遍歷完了,就可以遍歷自身了,遍歷完就可以出棧,如果有右子樹,那么就對右子樹繼續執行相同的操作遍歷,如果沒有右子樹就可以出棧下一個節點,也就是當前節點的父節點。


【代碼】

【遞歸方法】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> res;vector<int> inorderTraversal(TreeNode* root) {if (!root) return res;if(root->left) inorderTraversal(root->left);res.push_back(root->val);if (root->right) inorderTraversal(root->right);return res;}
};

【迭代方法】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> stk;while (root || stk.size()) {  // 當前節點不為空或棧不為空時循環操作while (root) {  // 一直走到沒有左子樹為止stk.push(root);root = root->left;}root = stk.top();  // root 為空時說明棧頂元素可以被遍歷了stk.pop();res.push_back(root->val);root = root->right;  // 如果沒有右子樹 root 就為空,下一次出棧的就是 root 的父節點}return res;}
};

二叉樹 - LeetCode 104. 二叉樹的最大深度(簡單)

【題目描述】

給定一個二叉樹 root,返回其最大深度。

二叉樹的最大深度是指從根節點到最遠葉子節點的最長路徑上的節點數。

【示例 1】

在這里插入圖片描述

輸入:root = [3,9,20,null,null,15,7]
輸出:3

【示例 2】

輸入:root = [1,null,2]
輸出:2

【提示】

樹中節點的數量在 [0,104][0, 10^4][0,104] 區間內。
?100<=Node.val<=100-100 <= Node.val <= 100?100<=Node.val<=100


【分析】

用 BFS 也就是類似前兩題的做法能夠求出層數,也可以直接用遞歸求解,從根節點往下遞歸求解每個節點的高度,到空節點了高度就為 0,否則當前節點的高度就是左子樹與右子樹中的最大高度加一(當前節點的高度比子樹多 1)。


【代碼】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int maxDepth(TreeNode* root) {  // 返回 root 的最大高度if (!root) return 0;return max(maxDepth(root->left), maxDepth(root->right)) + 1;}
};

二叉樹 - LeetCode 226. 翻轉二叉樹(簡單)

【題目描述】

給你一棵二叉樹的根節點 root,翻轉這棵二叉樹,并返回其根節點。

【示例 1】

在這里插入圖片描述

輸入:root = [4,2,7,1,3,6,9]
輸出:[4,7,2,9,6,3,1]

【示例 2】

在這里插入圖片描述

輸入:root = [2,1,3]
輸出:[2,3,1]

【示例 3】

輸入:root = []
輸出:[]

【提示】

樹中節點數目范圍在 [0,100][0, 100][0,100]
?100<=Node.val<=100-100 <= Node.val <= 100?100<=Node.val<=100


【分析】

從根節點開始遞歸地處理每個結點,將每個結點的左右子樹交換一下即可。


【代碼】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (!root) return nullptr;swap(root->left, root->right);invertTree(root->left);invertTree(root->right);return root;}
};

二叉樹 - LeetCode 101. 對稱二叉樹(簡單)

【題目描述】

給你一個二叉樹的根節點 root,檢查它是否軸對稱。

【示例 1】

在這里插入圖片描述

輸入:root = [1,2,2,3,4,4,3]
輸出:true

【示例 2】

在這里插入圖片描述

輸入:root = [1,2,2,null,3,null,3]
輸出:false

【提示】

樹中節點數目在范圍 [1,1000][1, 1000][1,1000]
?100<=Node.val<=100-100 <= Node.val <= 100?100<=Node.val<=100

進階:你可以運用遞歸和迭代兩種方法解決這個問題嗎?


【分析】

對稱的樹具有以下屬性之一:

  • 左右子節點均為空;
  • 左右子節點的值相同,且左子節點的左子樹與右子節點的右子樹相同,左子節點的右子樹與右子節點的左子樹相同。

因此我們可以遞歸判斷左右子樹是否對稱。

題目提到用遞歸和迭代實現,那么如何用迭代實現?

可以用隊列維護對稱的相對關系,首先將根節點的左右子節點入隊,然后不斷循環每次從隊列中取兩個節點,判斷這兩個節點是否對稱,然后將其中一個節點的左/右子節點與另一個節點的右/左子節點對應成兩組分別加入到隊列中,如果隊列為空遍歷完整棵樹還沒發現非對稱的節點說明整棵樹就是對稱的。


【代碼】

【遞歸方法】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {return dfs(root->left, root->right);}bool dfs(TreeNode* l, TreeNode* r) {if (!l && !r) return true;  // 兩個節點均為空if (!l || !r || l->val != r->val) return false;  // 只有一個節點為空或兩個節點值不同return dfs(l->left, r->right) && dfs(l->right, r->left);  // 左節點的左/右子樹要和右節點的右/左子樹對稱}
};

【迭代方法】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {queue<TreeNode*> Q;Q.push(root->left), Q.push(root->right);while (!Q.empty()) {auto p = Q.front(); Q.pop();auto q = Q.front(); Q.pop();if (!p && !q) continue;if (!p || !q || p->val != q->val) return false;  // 不對稱Q.push(p->left), Q.push(q->right);  // p 的左子節點需要和 q 的右子節點對稱Q.push(p->right), Q.push(q->left);  // p 的右子節點需要和 q 的左子節點對稱}return true;  // 全遍歷完了說明樹是對稱的}
};

二叉樹 - LeetCode 543. 二叉樹的直徑(簡單)

【題目描述】

給你一棵二叉樹的根節點,返回該樹的直徑

二叉樹的直徑是指樹中任意兩個節點之間最長路徑的長度。這條路徑可能經過也可能不經過根節點 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][1, 10^4][1,104]
?100<=Node.val<=100-100 <= Node.val <= 100?100<=Node.val<=100


【分析】

我們遞歸枚舉每個點作為路徑的最高點,那么這條路徑的長度為該結點往左子樹走的最大長度加上往右子樹走的最大長度,因此可以在遞歸的時候維護每個結點往下走到葉子結點的最大長度,這樣就能快速獲得當前結點左右子樹往下走的最大長度。

如果是多叉樹求樹的直徑有通用解法(求圖的最長路徑),首先任選一個點作為根結點,通過 DFS 找到最遠的結點,然后再將其作為根節點,通過 DFS 找到最遠的點,這段距離就是最長路徑。


【代碼】

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int res;int dfs(TreeNode* root) {  // 返回從 root 往下走的最長長度if (!root) return 0;int l = dfs(root->left), r = dfs(root->right);res = max(res, l + r);return max(l, r) + 1;}int diameterOfBinaryTree(TreeNode* root) {dfs(root);return res;}
};

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

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

相關文章

數據處理分析環境搭建+Numpy使用教程

環境搭建 數據分析常用開源庫 Numpy NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫。是一個運行速度非常快的數學庫&#xff0c;主要用于數組計算包含&#xff1a; 一個強大的N維數組對象 ndarray廣播功能函數整合 C/C/Fortran 代碼的工具線性代數、傅里葉變換、隨機…

實戰多屏Wallpaper壁紙顯示及出現黑屏問題bug分析-學員作業

背景&#xff1a; 在大家看了上一篇google官方對于多屏壁紙這塊的介紹后 安卓Wallpaper壁紙部分對多屏的支持-Google官方文檔介紹 可能還是對于壁紙支持多屏這塊沒有相關的實戰性的認知&#xff0c;所以本文就開始帶大家來進行部分解讀和實戰。 壁紙多屏顯示原理文檔解讀&a…

Vue插槽---slot詳解

1、什么是 Vue 插槽&#xff1f;Vue 插槽&#xff08;Slot&#xff09;?? 是 Vue 提供的一種非常強大且靈活的機制&#xff0c;用于實現&#xff1a;父組件向子組件傳遞一段模板內容&#xff08;HTML / 組件等&#xff09;&#xff0c;讓子組件在指定位置動態渲染這些內容。可…

STM32 - Embedded IDE - GCC - 顯著減少固件的體積

導言如上圖所示&#xff0c;在編譯器附加選項&#xff08;全局&#xff09;里添加--specsnano.specs&#xff0c;告訴編譯器使用newlib-nano替代newlib去編譯代碼。 newlib vs. newlib-nano newlib 是 GNU ARM 工具鏈默認的 C 標準庫&#xff0c;功能完整&#xff0c;但體積較大…

python的美食交流社區系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 摘要&…

《Redis持久化機制對比與RDB/AOF調優方案》

&#x1f4da; Redis持久化機制對比與RDB/AOF調優方案 &#x1f9e0;前言 在生產環境中&#xff0c;Redis 常常被用作緩存&#xff0c;但在更多場景下&#xff0c;它還存儲著核心業務數據&#xff08;如會話、訂單、隊列任務等&#xff09;。一旦 Redis 宕機、數據丟失&#…

eXtremeDB 醫療設備開發實戰:從合規到實時,構建 EN62304 級數據管理系統

在醫療設備開發領域&#xff0c;數據管理的 “可靠性” 與 “合規性” 是不可逾越的紅線 —— 監護儀心率數據的丟失可能延誤診斷時機&#xff0c;胰島素泵劑量記錄的錯誤則直接威脅患者生命安全。eXtremeDB 憑借對 EN62304 標準的深度合規支持、硬實時數據處理能力及多層次安全…

linux 設備驅動的分層思想

一、 概述像這樣的分層設計在linux的input、RTC、MTD、I2c、SPI、tty、USB等諸多類型設備驅動中屢見不鮮,下面對這些驅動進行詳細的分析。二、 輸入設備驅動輸入設備&#xff08;如按鍵、鍵盤、觸摸屏、鼠標等&#xff09;是典型的字符設備&#xff0c;其一般的工…

【嵌入式硬件實例】-555定時器驅動直流無刷電機

555定時器驅動直流無刷電機 文章目錄 555定時器驅動直流無刷電機 1、555定時器介紹 2、BLDC,無刷直流電機 3、DRV10866 驅動器 4、硬件準備與接線 5、電路工作原理 在這個項目中,我們將使用 555 定時器 IC 和 DRV10866 驅動器 IC 制作 BLDC、無刷直流電機驅動電路。無刷電機可…

Helm 常用命令 + Bitnami 中間件部署速查表

文章目錄一、Helm 常用命令速查表1.1. 倉庫管理1.2. Chart 搜索1.3. 應用部署1.4. 應用管理二、Bitnami 常用中間件部署示例三、常用自定義參數&#xff08;values.yaml 配置項&#xff09;四、安裝后的訪問方式五、一鍵安裝腳本 install-middleware.sh5.1. 完整腳本5.2. 使用方…

Ansible 自動化運維實戰系列(六):Valut詳解

Ansible 自動化運維實戰系列&#xff08;六&#xff09;&#xff1a;Valut詳解&#x1f4da; 系列導航一&#xff1a;概述二&#xff1a;命令1&#xff09;創建加密文件2&#xff09;加密已有文件3&#xff09;查看加密文件4&#xff09;編輯加密文件5&#xff09;解密文件6&am…

《探秘瀏覽器Web Bluetooth API設備發現流程》

網頁若需與藍牙設備通信,往往需依賴本地客戶端或專用驅動程序作為中介,不僅增加了用戶操作成本,也限制了Web應用在跨設備場景中的拓展。而Web Bluetooth API的出現,直接賦予了網頁與低功耗藍牙(BLE)設備對話的能力,從智能手環的健康數據同步,到智能家居設備的遠程控制,…

Jenkins+Python自動化持續集成詳細教程

Python接口自動化測試零基礎入門到精通&#xff08;2025最新版&#xff09;Jenkins安裝 ? Jenkins是一個開源的軟件項目&#xff0c;是基于java開發的一種持續集成工具&#xff0c;用于監控持續重復的工作&#xff0c;旨在提供一個開放易用的軟件平臺&#xff0c;使軟件的持續…

C++面試——內存

一、簡述堆和棧的區別維度棧&#xff08;Stack&#xff09;堆&#xff08;Heap&#xff09;生命周期隨函數調用自動創建/銷毀由程序員或垃圾回收器控制分配速度極快&#xff08;僅移動指針&#xff09;慢&#xff08;需查找空閑塊、維護元數據&#xff09;空間大小較小&#xf…

UVM驗證(三)—UVM機制(1)

目錄 &#xff08;一&#xff09;Factory工廠機制 1. 工廠機制核心邏輯&#xff1a;“注冊 - 創建 - 覆蓋” 2. 代碼映射&#xff1a;從概念到實現 3. 實驗目標&#xff1a;用 dadd_fixen_driver 固定 data_en1 4. 工廠機制的價值&#xff1a;“靈活驗證的基石” 5. 常見…

前往中世紀 送修改器(Going Medieval)免安裝中文版

網盤鏈接&#xff1a; 前往中世紀 免安裝中文版 名稱&#xff1a;前往中世紀 送修改器&#xff08;Going Medieval&#xff09;免安裝中文版 描述&#xff1a; 在Going Medieval的世界中&#xff0c;黑暗時代的社會已瀕臨崩潰。14世紀末瘟疫肆虐&#xff0c;全球95%的人口因…

Font Awesome 參考手冊

Font Awesome 參考手冊 引言 Font Awesome 是一個功能強大的圖標庫,它允許開發者通過簡單的 CSS 類來添加圖標到網頁中。本手冊旨在為開發者提供全面的 Font Awesome 使用指南,包括圖標選擇、樣式定制以及常見問題解答。 圖標選擇 圖標分類 Font Awesome 提供了多種類別…

源網荷儲一體化零碳智慧工業園區建設

針對傳統工業園區等電力消納大戶存在的供電模式單一、能源管理錯雜、園區人員設備安全統籌不到位等諸多問題&#xff0c;通過AI分析及物聯網等新技術和自研交直流關鍵設備的應用&#xff0c;在三維場景中構建集智慧能源、智慧安防、碳排放管理及智慧運營等功能于一體的新型零碳…

MySQL表操作(DDL)

MySQL表操作創建表查看表結構修改表結構增加一列刪除一列修改某一列的屬性修改某一列的名字修改某一列的屬性和名字插入幾條信息刪除表創建表 語法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collat…

【總結】Python多線程

【總結】Python多線程備注一、基本概念二、備注 2025/08/15 星期五 最近用到了python的多線程發現和其他語言有點不同記錄一下 一、基本概念 首先要理解一下線程、進程和協程的概念 線程&#xff08;Thread&#xff09;&#xff1a;是計算機能夠調度的最小計算單位 進程&…