【LeetCode 熱題 100】二叉樹的最大深度 / 翻轉二叉樹 / 二叉樹的直徑 / 驗證二叉搜索樹

頭像
??個人主頁:@小羊
??所屬專欄:LeetCode 熱題 100
很榮幸您能閱讀我的文章,誠請評論指點,歡迎歡迎 ~

動圖描述

目錄

    • 二叉樹的中序遍歷
    • 二叉樹的最大深度
    • 翻轉二叉樹
    • 對稱二叉樹
    • 二叉樹的直徑
    • 二叉樹的層序遍歷
    • 將有序數組轉換為二叉搜索樹
    • 驗證二叉搜索樹
    • 二叉搜索樹中第 K 小的元素
    • 二叉樹的右視圖
    • 二叉樹展開為鏈表
    • 從前序與中序遍歷序列構造二叉樹
    • 路徑總和
    • 路徑總和 II
    • 路徑總和 III


二叉樹的中序遍歷

  • 二叉樹的中序遍歷

在這里插入圖片描述

class Solution {vector<int> res;
public:vector<int> inorderTraversal(TreeNode* root) {dfs(root);return res;}void dfs(TreeNode* root){if (root == nullptr) return;dfs(root->left);res.push_back(root->val);dfs(root->right);}
};

二叉樹的最大深度

  • 二叉樹的最大深度

在這里插入圖片描述

class Solution {
public:int maxDepth(TreeNode* root) {if (root == nullptr) return 0;int left = maxDepth(root->left);int right = maxDepth(root->right);return left > right ? left + 1 : right + 1;}
};

翻轉二叉樹

  • 翻轉二叉樹

在這里插入圖片描述

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == nullptr) return nullptr;TreeNode *left = invertTree(root->left);TreeNode *right = invertTree(root->right);root->left = right;root->right = left;return root;}
};

對稱二叉樹

  • 對稱二叉樹

在這里插入圖片描述

class Solution {
public:bool isSymmetric(TreeNode* root) {return dfs(root->left, root->right);}bool dfs(TreeNode* left, TreeNode* right){if (left && right){if (left->val != right->val) return false;return dfs(left->left, right->right) && dfs(left->right, right->left);}else if (left != right) return false;else return true;}
};

二叉樹的直徑

  • 二叉樹的直徑

在這里插入圖片描述

class Solution {int depth;
public:int diameterOfBinaryTree(TreeNode* root) {dfs(root);return depth - 1;}int dfs(TreeNode* root){if (root == nullptr) return 0;int left = dfs(root->left);int right = dfs(root->right);depth = max(depth, left + right + 1);return max(left, right) + 1;}
};

二叉樹的層序遍歷

  • 二叉樹的層序遍歷

在這里插入圖片描述

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> q;if (root == nullptr) return res;q.push(root);while (q.size()){int sz = q.size();vector<int> tmp;while (sz--){TreeNode *node = q.front();tmp.push_back(node->val);q.pop();if (node->left) q.push(node->left);if (node->right) q.push(node->right);}res.push_back(tmp);}return res;}
};

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

  • 將有序數組轉換為二叉搜索樹

在這里插入圖片描述

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

驗證二叉搜索樹

  • 驗證二叉搜索樹

在這里插入圖片描述

遞歸遍歷。

class Solution {
public:bool isValidBST(TreeNode* root) {return dfs(root, LONG_MIN, LONG_MAX);}bool dfs(TreeNode* root, long min_val, long max_val){if (root == nullptr) return true;if (root->val <= min_val || root->val >= max_val) return false;return dfs(root->left, min_val, root->val) && dfs(root->right, root->val, max_val);}
};

前序遍歷。

class Solution {long prev = LONG_MIN;
public:bool isValidBST(TreeNode* root) {if (root == nullptr) return true;if (isValidBST(root->left) == false) return false;if (root->val <= prev) return false;prev = root->val; return isValidBST(root->right);}
};

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

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

在這里插入圖片描述

class Solution {int res, cnt;
public:int kthSmallest(TreeNode* root, int k) {cnt = k;dfs(root);return res;}void dfs(TreeNode* root){if (root == nullptr) return;dfs(root->left);if (--cnt == 0) {res = root->val;return;}dfs(root->right);}
};

二叉樹的右視圖

  • 二叉樹的右視圖

在這里插入圖片描述

從右往左層序遍歷,每次都只拿隊頭節點的值。

class Solution {
public:vector<int> rightSideView(TreeNode* root) {vector<int> res;if (root == nullptr) return res;queue<TreeNode*> q;q.push(root);while (q.size()){res.push_back(q.front()->val);int sz = q.size();while (sz--){TreeNode* node = q.front();q.pop();if (node->right) q.push(node->right);if (node->left) q.push(node->left);}}return res;}
};

二叉樹展開為鏈表

  • 二叉樹展開為鏈表

在這里插入圖片描述

方法一:在前序遍歷的過程中把節點存起來,結束后在處理每個節點的指向。

class Solution {
public:void flatten(TreeNode* root) {vector<TreeNode*> vt;dfs(root, vt);for (int i = 1; i < vt.size(); i++){TreeNode* prev = vt[i - 1], *cur = vt[i];prev->left = nullptr;prev->right = cur;}}void dfs(TreeNode* root, vector<TreeNode*>& vt){if (root){vt.push_back(root);dfs(root->left, vt);dfs(root->right, vt);}}
};

方法二:尋找前驅結點法。
在前序遍歷的過程中,如果當前節點的左子樹不為空,則遍歷到當前節點的右子樹的前一個節點為:當前節點左子樹中最右的那個節點。我們在遍歷的過程中找到這個前驅結點,將當前節點的右子樹拼接到這個前驅節點的右節點上,然后將當前節點的左子樹拼接到當前節點的右子樹上,最后當前節點左子樹置空。

class Solution {
public:void flatten(TreeNode* root) {TreeNode* cur = root;while (cur){if (cur->left){auto prev = cur->left;while (prev->right) prev = prev->right;prev->right = cur->right;cur->right = cur->left;cur->left = nullptr;}cur = cur->right;}}
};

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

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

在這里插入圖片描述

根據前序遍歷依次找到根節點,通過找到的根節點找到中序遍歷中根節點的位置,從而劃分出 [左子樹] [根節點] [右子樹]。
用哈希表存儲中序遍歷的值和下標映射關系,以至于能在找到根節點后直接拿到根節點在中序遍歷中的位置,然后根據中序遍歷的位置遞歸構建左子樹和右子樹。

class Solution {unordered_map<int, int> index;
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {for (int i = 0; i < inorder.size(); i++){index[inorder[i]] = i;}return dfs(preorder, 0, 0, inorder.size() - 1);}TreeNode* dfs(vector<int>& preorder, int root, int l, int r){if (l > r) return nullptr;TreeNode* node = new TreeNode(preorder[root]);int id = index[preorder[root]];node->left = dfs(preorder, root + 1, l, id - 1);node->right = dfs(preorder, root + id - l + 1, id + 1, r);return node;}
};

路徑總和

  • 路徑總和

在這里插入圖片描述

class Solution {
public:bool hasPathSum(TreeNode* root, int targetSum) {if (root == nullptr) return false;if (root->left == nullptr && root->right == nullptr) {return targetSum == root->val;}return hasPathSum(root->left, targetSum - root->val) || hasPathSum(root->right, targetSum - root->val);}
};

路徑總和 II

  • 路徑總和 II

在這里插入圖片描述

class Solution {vector<vector<int>> res;vector<int> path;
public:vector<vector<int>> pathSum(TreeNode* root, int targetSum) {dfs(root, targetSum);return res;}void dfs(TreeNode* root, int t){if (root == nullptr) return;path.push_back(root->val);if (root->left == nullptr && root->right == nullptr && t == root->val){res.push_back(path);}dfs(root->left, t - root->val);dfs(root->right, t - root->val);path.pop_back(); // 回溯}
};

路徑總和 III

  • 路徑總和 III

在這里插入圖片描述

class Solution {using ll = long long;unordered_map<ll, int> pre_cnt; // 記錄前綴和及其出現次數int t;
public:int pathSum(TreeNode* root, int targetSum) {t = targetSum;pre_cnt[0] = 1; // 前綴和恰好等于目標值return dfs(root, 0);}int dfs(TreeNode* root, ll sum) {if (root == nullptr) return 0;sum += root->val;int count = pre_cnt[sum - t];pre_cnt[sum]++;count += dfs(root->left, sum);count += dfs(root->right, sum);pre_cnt[sum]--;return count;}
};





本篇文章的分享就到這里了,如果您覺得在本文有所收獲,還請留下您的三連支持哦~

頭像

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

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

相關文章

Tomcat發布websocket

一、tomcal的lib放入文件 tomcat-websocket.jar websocket-api.jar 二、代碼示例 package com.test.ws;import com.test.core.json.Jmode;import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.concurrent.CopyOnWriteArraySet; imp…

LLM筆記(二)LLM數據基礎-分詞算法(2)

文章目錄 1. 分詞算法概述1.1 基于詞典的&#xff08;或基于規則的&#xff09;分詞算法1.2 基于統計的&#xff08;或基于機器學習的&#xff09;分詞算法1.3 基于深度學習的分詞算法1.4 子詞&#xff08;Subword&#xff09;分詞算法1.5 混合分詞算法1.6 針對不同語言的特點 …

Uniapp開發鴻蒙應用時如何運行和調試項目

經過前幾天的分享&#xff0c;大家應該應該對uniapp開發鴻蒙應用的開發語法有了一定的了解&#xff0c;可以進行一些簡單的應用開發&#xff0c;今天分享一下在使用uniapp開發鴻蒙應用時怎么運行到鴻蒙設備&#xff0c;并且在開發中怎么調試程序。 運行 Uniapp項目支持運行到…

數據湖與數據倉庫融合:Hudi、Iceberg、Delta Lake 實踐對比

在實時與離線一體化的今天,數據湖與數據倉庫邊界不斷融合,越來越多企業選用如 Hudi、Iceberg、Delta Lake 等開源方案實現統一的數據存儲、計算、分析平臺。本篇將圍繞以下關鍵點,展開實戰對比與解決方案分享: ? 實時寫入能力 ? ACID 保證 ? 增量數據處理能力 ? 流批一…

Python爬蟲(29)Python爬蟲高階:動態頁面處理與云原生部署全鏈路實踐(Selenium、Scrapy、K8s)

目錄 引言&#xff1a;動態爬蟲的技術挑戰與云原生機遇一、動態頁面處理&#xff1a;Selenium與Scrapy的協同作戰1.1 Selenium的核心價值與局限1.2 Scrapy-Selenium中間件開發1.3 動態分頁處理實戰&#xff1a;京東商品爬蟲 二、云原生部署&#xff1a;Kubernetes架構設計與優化…

數據結構(十)——排序

一、選擇排序 1.簡單選擇排序 基本思想&#xff1a;假設排序表為[1,…,n]&#xff0c;第i趟排序即從[i,…,n]中選擇關鍵字最小的元素與L[i]交換 eg&#xff1a;給定關鍵字序列{87&#xff0c;45&#xff0c;78&#xff0c;32&#xff0c;17&#xff0c;65&#xff0c;53&…

小結:jvm 類加載過程

類加載過程 是Java虛擬機&#xff08;JVM&#xff09;將字節碼文件&#xff08;.class文件&#xff09;加載到內存中&#xff0c;并轉換為運行時數據結構的過程。這個過程可以分為多個步驟&#xff0c;每個步驟都有其特定的任務和目的。根據你提供的信息&#xff0c;以下是類加…

2024 山東省ccpc省賽

目錄 I&#xff08;簽到&#xff09; 題目簡述&#xff1a; 思路&#xff1a; 代碼&#xff1a; A&#xff08;二分答案&#xff09; 題目簡述&#xff1a; 思路&#xff1a; 代碼&#xff1a; K&#xff08;構造&#xff09; 題目&#xff1a; 思路&#xff1a; 代…

turn.js與 PHP 結合使用來實現 PDF 文件的頁面切換效果

將 Turn.js 與 PHP 結合使用來實現 PDF 文件的頁面切換效果&#xff0c;你需要一個中間步驟將 PDF 轉換為 Turn.js 可以處理的格式&#xff08;如 HTML 頁面或圖片&#xff09;。以下是實現這一功能的步驟和示例代碼&#xff1a; 步驟 1: 安裝必要的庫 首先&#xff0c;你需要…

Python實現NOA星雀優化算法優化卷積神經網絡CNN回歸模型項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔視頻講解&#xff09;&#xff0c;如需數據代碼文檔視頻講解可以直接到文章最后關注獲取。 1.項目背景 在當今數據驅動的時代&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;不僅在圖像分類任務中…

(面試)View相關知識

1、View繪制流程 onMeasure() 確定View的測量寬高。onLayout() 確定View的最終寬高和四個頂點的位置。onDraw() 將View 繪制到屏幕上。 2、MeasureSpec有三種測量模式&#xff1a; 2.1. EXACTLY&#xff08;精確模式&#xff09; 含義&#xff1a;父容器明確指定了子View的精…

數組名既可作為指針也可作為變量名

在C語言中&#xff0c;數組名在不同的上下文中既可以作為指向數組首個元素的指針&#xff0c;也可以代表整個數組&#xff0c;這是由C語言的設計和語法規則決定的&#xff0c;下面我來詳細解釋一下。 1. 數組名作為指向首元素的指針 在大多數情況下&#xff0c;當數組名出現在…

Java異常、泛型與集合框架實戰:從基礎到應用

在Java編程的世界里&#xff0c;異常處理、泛型和集合框架是構建高效、健壯應用的關鍵技術。通過掌握這些技術&#xff0c;我們可以更好地管理程序運行時的錯誤&#xff0c;提高代碼的復用性和類型安全性。今天&#xff0c;我將通過一系列實驗&#xff0c;分享如何在Java中使用…

Spring源碼之解決循環依賴 三級緩存

目錄 三級緩存核心原理 循環依賴的解決過程 1. Bean A創建過程中提前曝光工廠 2. Bean B創建時發現依賴A&#xff0c;從緩存獲取 3. Bean A繼續完成初始化 三級緩存的作用總結 二級緩存為何不夠解決緩存依賴&#xff1f; 三級緩存如何解決&#xff1f; 為什么不直接在…

K8S Ingress 實現AB測試、藍綠發布、金絲雀(灰度)發布

假設有如下三個節點的 K8S 集群&#xff1a; ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、場景分析 閱讀本文&#xff0c;默認您已經安裝了 Ingress Nginx。 1&#xff09;A/B 測試 A/B 測試基于用戶請求的元信息將流量路由…

深入理解構造函數,析構函數

目錄 1.引言 2.構造函數 1.概念 2.特性 3.析構函數 1.概念 2.特性 1.引言 如果一個類中什么都沒有&#xff0c;叫作空類. class A {}; 那么我們這個類中真的是什么都沒有嗎?其實不是,如果我們類當中上面都不寫.編譯器會生成6個默認的成員函數。 默認成員函數:用戶沒有顯…

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接 1 說明2 客戶端配置jdk環境3服務器檢查oracle數據庫補丁4設置ssla 服務器配置walletb 上傳測試腳本和配置文件到客戶端c 服務器修改數據庫偵聽和sqlnet.orad 修改客戶端的sqlnet.ora和tnsnames.ora的連接符e 修改java代碼的數據連接…

BrepGen中的幾何特征組裝與文件保存詳解 deepwiki occwl OCC包裝庫

有這種好東西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 組裝幾何特征以創建B-rep模型 保存為STEP和STL文件細說 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重慶 ICPC 比賽游記

2025.5.9 比賽前一天晚上&#xff0c;激動地睡不著覺&#xff0c;起來收拾了好多東西。&#xff08;其實就四本書&#xff0c;剩下的全是零食……關鍵在于這四本書基本沒用。&#xff09; 2025.5.10 學校喪心病狂的讓我們 6:20 到校門口集合坐車&#xff08;據說是怕趕不上比…

0x08.Redis 支持事務嗎?如何實現?

回答重點 Redis 支持事務,但它的事務與 MySQL 等關系型數據庫的事務有著本質區別。MySQL 中的事務嚴格遵循 ACID 特性,而 Redis 中的事務主要保證的是命令執行的原子性和隔離性,即所有命令在一個不可分割的操作中順序執行,不會被其他客戶端的命令請求所打斷。 最關鍵的區…