力扣hot100——二叉樹

94. 二叉樹的中序遍歷

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> stk;while (root || stk.size()) {while (root) {stk.push(root);root = root->left;}auto cur = stk.top();stk.pop();ans.push_back(cur->val);root = cur->right;}return ans;}
};
class Solution {
public:int maxDepth(TreeNode* root) {auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root == NULL) return 0;return max(dfs(root->left), dfs(root->right)) + 1;};return dfs(root);}
};

使用棧模擬

中序遍歷本質是根在中,從左往右

因此一開始就先往左邊找,找不到的情況下,說明可以往右邊找了,然后又變成了一個子問題

104. 二叉樹的最大深度

class Solution {
public:int maxDepth(TreeNode* root) {auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root == NULL) return 0;return max(dfs(root->left), dfs(root->right)) + 1;};return dfs(root);}
};

?經典模擬題

226. 翻轉二叉樹

class Solution {
public:TreeNode* invertTree(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* root) -> void {if (root == NULL) return;TreeNode* tmp = root->left;root->left = root->right;root->right = tmp;dfs(root->left);dfs(root->right);};dfs(root);return root;}
};
交換指針的時候注意tmp保存

101. 對稱二叉樹

class Solution {
public:bool isSymmetric(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* p1, TreeNode* p2) -> bool {if ((p1 && !p2) || (!p1 && p2) || (p1 && p2 && p1->val != p2->val)) return false;if (!p1 && !p2) return true;return dfs(p1->left, p2->right) && dfs(p1->right, p2->left);};return dfs(root->left, root->right);}
};

?模擬:分情況考慮即可

543. 二叉樹的直徑

class Solution {
public:int diameterOfBinaryTree(TreeNode* root) {int ans = 0;auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root->left && root->right) {int t1 = max(dfs(root->left), 0);int t2 = max(dfs(root->right), 0);int t = t1 + t2 + 1;ans = max(ans, t);return max(t1, t2) + 1;}else if (root->left) {int t = max(dfs(root->left), 0) + 1;ans = max(ans, t);return t;}else if (root->right) {int t = max(dfs(root->right), 0) + 1;ans = max(ans, t);return t;}else {ans = max(ans, 1);return 1;}};dfs(root);return ans - 1;}
};

?維護以root為根節點(包含在內)的單鏈最長?

?102. 二叉樹的層序遍歷

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> v(2000);if (root == NULL) return {};queue<pair<TreeNode*, int>> q;q.push({root, 0});while (q.size()) {pair<TreeNode*, int> now = q.front();q.pop();auto u = now.first;int dep = now.second;v[dep].push_back(u->val);if (u->left) {q.push({ u->left , dep + 1});}if (u->right) {q.push({ u->right , dep + 1});}}vector<vector<int>> ans;for (auto vec : v) {if (vec.size()) ans.push_back(vec);}return ans;}
};

?BFS記錄深度

?108. 將有序數組轉換為二叉搜索樹

class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {auto dfs = [&](this auto&& dfs,int l, int r) -> TreeNode* {if (l > r) return NULL;int mid = (l + r) / 2;TreeNode* root = new TreeNode(nums[mid]);root->left = dfs(l, mid - 1);root->right = dfs(mid + 1, r);return root;};return dfs(0, nums.size() - 1);}
};

利用中序遍歷的有序性,每次選擇中間節點作為根節點,劃分子問題

98. 驗證二叉搜索樹

class Solution {
public:bool isValidBST(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* root, long long l, long long r) -> bool {if (root == NULL) return true;if (root->val <= l || root->val >= r) return false;return dfs(root->left, l, root->val) && dfs(root->right, root->val, r);};return dfs(root, LONG_MIN, LONG_MAX);}
};

函數表示考慮以?root?為根的子樹,判斷子樹中所有節點的值是否都在?(l,r)?的范圍內(注意是開區間)。同時注意開long long

230. 二叉搜索樹中第 K 小的元素

class Solution {
public:int kthSmallest(TreeNode* root, int k) {// vector<int> v;int ans;auto dfs = [&](this auto&& dfs, TreeNode* root) -> bool {if (root == NULL) return false;if (dfs(root->left)) return true;k--;if (k == 0) {ans = root->val;return true;}return dfs(root->right);};dfs(root);return ans;}
};

利用平衡二叉樹的中序遍歷的有序性

199. 二叉樹的右視圖

class Solution {
public:vector<int> rightSideView(TreeNode* root) {if (root == NULL) return {};vector<int> ans;queue<TreeNode*> q;q.push(root);while (q.size()) {vector<TreeNode*> v;while (q.size()) {v.push_back(q.front());q.pop();}ans.push_back(q.back()->val);for (auto root : v) {if (root->left)q.push(root->left);if (root->right)q.push(root->right);}}return ans;}
};

?層序遍歷每一層的最右邊節點就是答案

114. 二叉樹展開為鏈表

class Solution {
public:void flatten(TreeNode* root) {TreeNode* dummy = new TreeNode(0);TreeNode* cur = dummy;auto dfs = [&](this auto&& dfs, TreeNode* root) {if (root == NULL) return;cur->right = root;cur = cur->right;TreeNode* pl = root->left;TreeNode* pr = root->right;cur->left = NULL;cur->right = NULL;dfs(pl);dfs(pr);};dfs(root);}
};

先序遍歷模擬

105. 從前序與中序遍歷序列構造二叉樹

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int k = 0;map<int, int> mp;for (int i = 0; i < inorder.size(); i++)mp[inorder[i]] = i;auto dfs = [&](this auto&& dfs, int l, int r) -> TreeNode* {if (l > r) return NULL;TreeNode* root = new TreeNode(preorder[k++]);root->left = dfs(l, mp[root->val] - 1);root->right = dfs(mp[root->val] + 1, r);return root;};return dfs(0, inorder.size() - 1);}
};

只要我們在中序遍歷中定位到根節點,那么我們就可以分別知道左子樹和右子樹中的節點數目。由于同一顆子樹的前序遍歷和中序遍歷的長度顯然是相同的,因此我們就可以對應到前序遍歷的結果中,對上述形式中的所有左右括號進行定位。

這樣以來,我們就知道了左子樹的前序遍歷和中序遍歷結果,以及右子樹的前序遍歷和中序遍歷結果,我們就可以遞歸地對構造出左子樹和右子樹,再將這兩顆子樹接到根節點的左右位置。

每次遞歸構造的時候,當前先序遍歷數組的當前第一個節點一定是當前子樹的根節點

437. 路徑總和 III

class Solution {
public:using ll = long long;int pathSum(TreeNode* root, ll targetSum) {map<ll, int> mp;ll ans = 0;mp[0]++;auto dfs = [&](this auto&& dfs, TreeNode* root, ll sum) {if (root == NULL) return;sum += root->val;ans += mp[sum - targetSum];mp[sum]++;dfs(root->left, sum);dfs(root->right, sum);mp[sum]--;};dfs(root, 0);return ans;}
};

哈希,dfs表示從根節點開始統計答案,并且結束后清除對map的影響的貢獻

?236. 二叉樹的最近公共祖先

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {unordered_map<TreeNode*, int> dep;unordered_map<TreeNode*, TreeNode*> f;dep[NULL] = 0;auto dfs = [&](this auto&& dfs, TreeNode* root, TreeNode* fa) {if (root == NULL) return;dep[root] = dep[fa] + 1;f[root] = fa;dfs(root->left, root);dfs(root->right, root);};dfs(root, NULL);if (dep[p] < dep[q]) swap(p, q);while (dep[p] != dep[q]) {p = f[p];}if (p == q) return p;while (p != q) {p = f[p];q = f[q];}return p;}
};

貪心,先跳到同一層,再往上跳直到相同

?124. 二叉樹中的最大路徑和

class Solution {
public:int maxPathSum(TreeNode* root) {int ans = -1e9;auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root->left && root->right) {int t1 = max(dfs(root->left), 0);int t2 = max(dfs(root->right), 0);int t = t1 + t2 + root->val;ans = max(ans, t);return max(t1, t2) + root->val;}else if (root->left) {int t = max(dfs(root->left), 0) + root->val;ans = max(ans, t);return t;}else if (root->right) {int t = max(dfs(root->right), 0) + root->val;ans = max(ans, t);return t;}else {ans = max(ans, root->val);return root->val;}};dfs(root);return ans;}
};

貪心,dfs記錄從root開始,單鏈的最大值

注意分類討論取最大值

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

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

相關文章

設計模式 創建型 單例模式(Singleton Pattern)與 常見技術框架應用 解析

單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;旨在確保某個類在應用程序的生命周期內只有一個實例&#xff0c;并提供一個全局訪問點來獲取該實例。這種設計模式在需要控制資源訪問、避免頻繁創建和銷毀對象的場景中尤為有用。 一、核心…

您的公司需要小型語言模型

當專用模型超越通用模型時 “越大越好”——這個原則在人工智能領域根深蒂固。每個月都有更大的模型誕生&#xff0c;參數越來越多。各家公司甚至為此建設價值100億美元的AI數據中心。但這是唯一的方向嗎&#xff1f; 在NeurIPS 2024大會上&#xff0c;OpenAI聯合創始人伊利亞…

uniapp-vue3(下)

關聯鏈接&#xff1a;uniapp-vue3&#xff08;上&#xff09; 文章目錄 七、咸蝦米壁紙項目實戰7.1.咸蝦米壁紙項目概述7.2.項目初始化公共目錄和設計稿尺寸測量工具7.3.banner海報swiper輪播器7.4.使用swiper的縱向輪播做公告區域7.5.每日推薦滑動scroll-view布局7.6.組件具名…

使用 Python 實現隨機中點位移法生成逼真的裂隙面

使用 Python 實現隨機中點位移法生成逼真的裂隙面 一、隨機中點位移法簡介 1. 什么是隨機中點位移法&#xff1f;2. 應用領域 二、 Python 代碼實現 1. 導入必要的庫2. 函數定義&#xff1a;隨機中點位移法核心邏輯3. 設置隨機數種子4. 初始化二維裂隙面5. 初始化網格的四個頂點…

mysql之組內排序ROW_NUMBER()函數

有個需求&#xff0c;需要組內排序&#xff0c;之前似乎從未接觸過此類排序&#xff0c;故查詢了一下&#xff0c;記錄sql執行結果。 表如下&#xff1a; play_log: 日期 (fdate)用戶 ID (user_id)歌曲 ID (song_id)2022-01-081000002022-01-161000002022-01-201000002022-0…

Android TV端彈出的PopupWindow沒有獲取焦點

在 TV 開發中&#xff0c;焦點管理是通過 Focus Navigation 實現的&#xff0c;PopupWindow 默認不接受焦點&#xff0c;導致遙控器無法選擇彈窗內的控件。這是因為 PopupWindow 默認不會將焦點傳遞到其內容視圖上。 要解決問題&#xff0c;可以通過以下步驟調整 PopupWindow …

活動預告 | Microsoft Power Platform 在線技術公開課:實現業務流程自動化

課程介紹 參加“Microsoft Power Platform 在線技術公開課&#xff1a;實現業務流程自動化”活動&#xff0c;了解如何更高效地開展業務。參加我們舉辦的本次免費培訓活動&#xff0c;了解如何借助 Microsoft AI Builder 和 Power Automate 優化工作流。結合使用這些工具可以幫…

FPGA(二)組成結構基礎內容

1. FPGA的基本結構 FPGA主要由以下部分組成&#xff1a; &#xff08;1&#xff09;可編程邏輯單元&#xff08;CLB&#xff09;&#xff1a;CLB是FPGA中最基本的邏輯單元&#xff0c;由查找表&#xff08;LUT&#xff09;和觸發器組成&#xff0c;可實現任意邏輯功能。查找表…

LLM(十二)| DeepSeek-V3 技術報告深度解讀——開源模型的巔峰之作

近年來&#xff0c;大型語言模型&#xff08;LLMs&#xff09;的發展突飛猛進&#xff0c;逐步縮小了與通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 團隊最新發布的 DeepSeek-V3&#xff0c;作為一款強大的混合專家模型&#xff08;Mixture-of-Experts, MoE&a…

el-pagination 為什么只能展示 10 條數據(element-ui@2.15.13)

好的&#xff0c;我來幫你分析前端為什么只能展示 10 條數據&#xff0c;以及如何解決這個問題。 問題分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 組件中&#xff0c;pageSize 的值被設置為 10&#xff1a;<el-pagination:current-page"current…

TCP網絡編程(一)—— 服務器端模式和客戶端模式

這篇文章將會編寫基本的服務器網絡程序&#xff0c;主要講解服務器端和客戶端代碼的原理&#xff0c;至于網絡名詞很具體的概念&#xff0c;例如什么是TCP協議&#xff0c;不會過多涉及。 首先介紹一下TCP網絡編程的兩種模式&#xff1a;服務器端和客戶端模式&#xff1a; 首先…

C# 設計模式(行為型模式):責任鏈模式

C# 設計模式&#xff08;行為型模式&#xff09;&#xff1a;責任鏈模式 責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為型設計模式&#xff0c;用于讓多個對象有機會處理同一個請求&#xff0c;避免請求發送者與接收者之間的耦合。它通過將請…

在K8S中,如何部署kubesphere?

在Kubernetes集群中&#xff0c;對于一些基礎能力較弱的群體來說K8S控制面板操作存在一定的難度&#xff0c;此時kubesphere可以有效的解決這類難題。以下是部署kubesphere的操作步驟&#xff1a; 操作部署&#xff1a; 1. 部署nfs共享存儲目錄 yum -y install nfs-server e…

CSS系列(43)-- Anchor Positioning詳解

前端技術探索系列&#xff1a;CSS Anchor Positioning詳解 &#x1f3af; 致讀者&#xff1a;探索智能定位的藝術 &#x1f44b; 前端開發者們&#xff0c; 今天我們將深入探討 CSS Anchor Positioning&#xff0c;這個強大的元素定位特性。 基礎概念 &#x1f680; 錨點設…

Python判別不同平臺操作系統調用相應的動態庫讀寫NFC

本示例使用的發卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bV0E4YV&ftt&id615391857885 import sys import struct # struct的pack函數把任意數據類型變成字符串 import ctypes # 調用DLL動態庫要有這個引用if sys.platform…

樹莓派之旅-第一天 系統的燒錄和設置

自言自語&#xff1a; 在此記錄一下樹莓派的玩法。以后有錢了買點來玩啊草 系統的安裝燒錄 系統下載 樹莓派官網&#xff1a;https://www.raspberrypi.com/ 首頁點擊SoftWare進入OS下載頁面 這里是安裝工具&#xff1a;安裝工具負責將系統鏡像安裝到sd卡中 點擊下載符合自己…

商用車自動駕駛,迎來大規模量產「臨界點」?

商用車自動駕駛&#xff0c;正迎來新的行業拐點。 今年初&#xff0c;交通部公開發布AEB系統運營車輛標配征求意見稿&#xff0c;首次將法規限制條件全面放開&#xff0c;有望推動商用車AEB全面標配&#xff0c;為開放場景的商用車智能駕駛市場加了一把火。 另外&#xff0c;…

人工智能及深度學習的一些題目

1、一個含有2個隱藏層的多層感知機&#xff08;MLP&#xff09;&#xff0c;神經元個數都為20&#xff0c;輸入和輸出節點分別由8和5個節點&#xff0c;這個網絡有多少權重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;權重是連接神經元的參數&#xff0c;每個連接都有一…

Solon 加入 GitCode:助力國產 Java 應用開發新飛躍

在當今數字化快速發展的時代&#xff0c;Java 應用開發框架不斷演進&#xff0c;開發者們始終在尋找更快、更小、更簡單的解決方案。近期&#xff0c;Solon 正式加入 GitCode&#xff0c;為廣大 Java 開發者帶來全新的開發體驗&#xff0c;尤其是在國產應用開發進程中&#xff…

VScode 只能運行c,運行不了c++的解決問題

原文鏈接&#xff1a;Vscode只能運行c&#xff0c;運行不了c的解決方法 VScode 只能運行c&#xff0c;運行不了c&#xff0c;怎么回事呢&#xff0c;解決問題&#xff1a; 在tasks.json中加上“"-lstdc"”&#xff0c; 這樣之后 要重啟VScode&#xff0c;點擊鏈接…