代碼隨想錄算法訓練營:19/60

非科班學習算法day19?| LeetCode530:二叉搜索樹的最小絕對差?,Leetcode501:二叉搜索樹的眾數 ,Leetcode236:二叉樹的最近公共祖先?

目錄

介紹

一、LeetCode題目

1.LeetCode530:二叉搜索樹的最小絕對差?

題目解析

?2.Leetcode501: 二叉搜索樹的眾數?

題目解析

3.Leetcode236:二叉樹的最近公共祖先

題目解析

?

總結


介紹

包含LC的兩道題目,還有相應概念的補充。

相關圖解和更多版本:

代碼隨想錄 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、LeetCode題目

1.LeetCode530:二叉搜索樹的最小絕對差?

題目鏈接:530. 二叉搜索樹的最小絕對差 - 力扣(LeetCode)

題目解析

? ? ? ?首先要知道,最小絕對差會出現在什么位置,因為限定了任意兩個數的差值,但根據二叉搜索樹的特點,如果用相隔遠的兩個數相減,差值一定大于相鄰兩數,所以問題退化到中序遍歷相鄰兩數計算最小差值。

? ? ? ? 可以采用設置臨時指針pre來一遍遍歷就完成。

? ? ? ? 或者直觀的方法,中序遍歷記錄元素信息,將得到的數組進行遍歷。

?c++代碼如下:

/*** 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* pre = nullptr;// 創建最大值int min_dif = INT_MAX;// 中序遍歷函數void dis(TreeNode* root) {if (!root)return;// 左dis(root->left);// 處理if (pre) {int cur_dif = abs(pre->val - root->val);min_dif = min(min_dif, cur_dif);}pre = root;dis(root->right);return;}int getMinimumDifference(TreeNode* root) {dis(root);return min_dif;}
};

比較直觀的c++代碼如下:

/*** 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:void dis(TreeNode* root, vector<int>& vec) {if (!root)return;dis(root->left, vec);vec.push_back(root->val);dis(root->right, vec);return;}int getMinimumDifference(TreeNode* root) {vector<int> result;dis(root, result);int min_num = INT_MAX;for (int i = 0; i < result.size() - 1; ++i) {min_num = min(min_num, result[i + 1] - result[i]);}return min_num;}
};

?2.Leetcode501: 二叉搜索樹的眾數?

題目鏈接:501. 二叉搜索樹中的眾數 - 力扣(LeetCode)

題目解析

? ? ? ?個人認為很喜歡的一道題目,我遵循的也是雙指針思想:中序遍歷,實時更新最大長度,然后將最大長度對應的結果放到返回數組中,但是遇到了問題:

? ? ? ? 1.最大初始長度設置為0,這樣一開始的根節點怎么處理,因為實際上最小的長度應該是1

? ? ? ? 2.在一次遍歷的過程中,如果發現最大值就記錄,其實不能保證這是全過程的最大長度(后面的可能會有更長的),那么彈出的條件怎么設置。
? ? ? ?

?C++代碼如下:?

/*** 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* pre = nullptr;// 設置最大長度int max_len = 0;// 設置當前長度int len = 0;vector<int> res;void dis(TreeNode* root) {if (!root)return;dis(root->left);if (!pre)len = 1;else if (pre->val == root->val) {len++;} elselen = 1;if (len == max_len) {res.push_back(root->val);}if (len > max_len) {max_len = len;res.clear();res.push_back(root->val);}pre = root;dis(root->right);return;}vector<int> findMode(TreeNode* root) {max_len = 0;len = 0;res.clear();pre = nullptr;dis(root);return res;}
};

關于這兩個問題:1.pre指針還指向空的時候就把指針設置為1,注意在長度沒有增加時候else情況,要把長度重置為1,這點很重要。其實我認為也可以直接初始化就設置為1;

2.沒有必要彈出,因為如果后面搜索到更長的長度,我們只需要清空當前結果就可以了,前面的結果都不是想要的。

??

3.Leetcode236:二叉樹的最近公共祖先

題目鏈接:236. 二叉樹的最近公共祖先 - 力扣(LeetCode)

題目解析

? ? ? ?一開始理解的很艱難,因為涉及到類似于從底部向上檢索的過程,這里面是一定有回溯。首先糾正一個問題,就是我在嘗試用bool的返回類型輔助函數,但是我寫的過程中發現我無法用這個函數來記錄或者說返回節點信息,除非是用pair來記錄存在信息和節點信息,那樣理解是相對好了,但是寫法上復雜度大大增加。

? ? ? ? 現在的寫法的關鍵就是,還是后序遍歷的模板,但是在回溯過程中(就是return!)當不存在我們需要檢索的值時候,返回空指針,這樣也可以幫助我們bool判斷!

? ? ? ? 標記一下,相關的有需要下向上搜索的題目,后期再比對總結:樹的最大深度/最小深度,樹的直徑,路徑總和問題

C++代碼如下:

/*** 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:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root)return NULL;if (root->val == p->val || root->val == q->val)return root;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if (left && right)return root;if (!left && right)return right;if (left && !right)return left;elsereturn NULL;}
};

注意點1:代碼雖然看起來簡單,但是這個中止條件之所以沒有放在后面是因為,遵循的邏輯是先向下搜索,搜索到需要值,返回這個節點信息到上一層,這樣就記錄了節點信息。

而后面的處理是針對于一層遞歸左右結束之后中節點的處理邏輯,兩者是不一樣的,不要混淆。

?

總結


補打卡第19天,堅持!!!

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

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

相關文章

軟設之加工邏輯之結構化語言

結構化語言是一種介于自然語言和形式化語言之間的半形式語言&#xff0c;是自然語言的一個受限子集 外層&#xff1a;用來描述控制結構&#xff0c;采用順序&#xff0c;選擇和重復3種基本結構 1.順序結構&#xff1a;一組祈使語句&#xff0c;選擇語句&#xff0c;重復語句的…

個人對JVM的一點理解

JVM&#xff08;Java 虛擬機&#xff09;是 Java 程序能夠跨平臺運行的關鍵。它負責將 Java 字節碼轉換為機器碼并執行。 JVM 主要由類加載器、運行時數據區、執行引擎和本地方法接口等部分組成。運行時數據區包括方法區、堆、虛擬機棧、本地方法棧和程序計數器等。 GC&#xf…

遠期利率(Forward Rate)是什么?以及遠期利率在期貨合約中的應用

遠期利率是什么&#xff1f; 中文版 遠期利率&#xff08;Forward Rate&#xff09;是指從未來某一時間段開始適用的利率。它是金融市場上的一種合約利率&#xff0c;表示在某個特定日期開始的一段時間內的預期利率。這種利率可以通過現有的即期利率&#xff08;Spot Rate&am…

6.26考試前總結

一、選擇 1、運算符重載&#xff1a;&#xff08;1&#xff09;不可重載&#xff1a;. .* :: ?: sizeof &#xff08;2&#xff09;只成員函數&#xff1a;、[]、&#xff08;&#xff09;、-> ps:和[]需要加&&#xff0c;返回類&#xff0c;[]返回中括號內…

SpringBoot根據不同IP限制接口的QPS

根據對方IP地址來限制接口的QPS&#xff08;每秒查詢率&#xff09;&#xff0c;你可以結合Spring Boot應用、Guava的RateLimiter或者自定義的并發控制邏輯來實現。以下是一個基于Guava RateLimiter和Spring Boot的示例&#xff0c;展示如何根據IP地址來限制接口的QPS&#xff…

鏡頭下的光學

說實話&#xff0c;當我看到幾何光學的內容全是初中的解析幾何的時候&#xff0c;我就覺得講的方式太原始了&#xff0c;而且太過復雜也看不懂。所以我嘗試做了數學建模&#xff0c;發現建模之后模型可以解釋一些物理現象&#xff0c;也不會有矛盾的地方&#xff0c;那就算過得…

【Python系列】探索 Python 環境管理工具:conda 與 pip 的比較

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

簡過網:專科生可以考的編制崗位有哪些?這5個鐵飯碗要抓住了!

專科生可以考的編制崗位有哪些&#xff1f;以下這幾種可以考的&#xff0c;尤其是應屆畢業生&#xff0c;一定要抓住機會哦&#xff01; ? 一、三支一扶&#xff1a;專科生可報考&#xff0c;期滿可轉編。 三支一扶&#xff1a;支農、支醫生、支教、扶貧 工作時間一般為2年&…

深入探索Postman:前置與后置腳本的編寫與應用

Postman是一款廣受歡迎的API開發和測試工具&#xff0c;它提供了豐富的功能來簡化接口測試過程。在Postman中&#xff0c;前置腳本&#xff08;Pre-request Script&#xff09;和后置腳本&#xff08;Tests Script&#xff09;是兩個強大的功能&#xff0c;允許用戶在發送請求之…

秋招Java后端開發沖刺——非關系型數據庫篇(Redis)

一、非關系型數據庫 1. 主要針對的是鍵值、文檔以及圖形類型數據存儲。 2. 特點&#xff1a; 特點說明靈活的數據模型支持多種數據模型&#xff08;文檔、鍵值、列族、圖&#xff09;&#xff0c;無需預定義固定的表結構&#xff0c;能夠處理各種類型的數據。高擴展性設計為水…

安全技術和防火墻(一)

安全技術和防火墻 安全技術 入侵檢測系統&#xff1a;特點是不阻斷網絡訪問&#xff0c;主要提供報警和事后監督 不主動介入 (監控) 入侵防御系統&#xff1a;透明模式工作 &#xff0c;數據包,網絡監控,服務攻擊,木馬,蠕蟲,系統漏洞 等 進行準確的分析判斷 判斷為攻擊行為后會…

高校心理咨詢管理系統

摘 要 隨著高校學生心理問題的增多&#xff0c;心理咨詢服務在高校中的重要性日益凸顯。然而&#xff0c;傳統的心理咨詢管理方式存在著諸多問題&#xff0c;如信息不透明、咨詢師資源不足等。為了解決這些問題&#xff0c;本文設計并實現了一種基于Java Web的高校心理咨詢管理…

model_json_schema

model_json_schema示列 from pydantic import BaseModel, Field, ValidationError, field_validatorclass User(BaseModel):id: int Field(default0, lt100, gt0)username: stremail: strfield_validator(username)def name_must_alpha(cls, v):assert v.isalpha(), name mus…

浸式冷卻設計參數

每天一篇行業發展資訊&#xff0c;讓大家更及時了解外面的世界。 更多資訊&#xff0c;請關注B站/公眾號【萊歌數字】&#xff0c;有視頻教程~~ 兩相被動浸入冷卻是指使用改變相的沸騰液體來去除一個或多個表面的熱量的冷卻系統。 然后蒸汽被移動到冷凝器&#xff0c;然后被…

LaTeX中添加矩陣分塊虛線并設置虛線疏密

對于大型矩陣&#xff0c;有時需要添加分塊虛線。 方法為使用arydshln宏包&#xff0c;然后在array環境中設置虛線。需要注意的是&#xff0c;使用矩陣環境需要搭配amsmath宏包使用&#xff0c;且需放在amsmath宏包之后。即導言區設置為 \usepackage{amsmath} \usepackage{ary…

日語培訓日語等級考試柯橋小語種學習語言學校

什么是外來語 外來語是指在日本的國語中使用的來源于外國語言的詞匯。但狹義上的外來語則是指來源于歐美國家語言的詞匯&#xff0c;其中大部分是來源于英美語系的詞匯。日語中的漢語詞匯很多&#xff0c;大多是自古以來從中國引進的&#xff0c;從外來語的定義看&#xff0c;漢…

NLP邏輯層次模型|跳出局限,站在更高維度認識自己

什么是NLP邏輯層次模型 N-Neuro&#xff1a;指神經系統&#xff0c;包括生理基礎&#xff08;大腦&#xff09;和思維運作過程 L-Linguistic&#xff1a;指語言&#xff0c;感覺信號輸出——構成意思的過程 P-Programming&#xff1a;指程序&#xff0c;大腦產生某結論后要具體…

【干貨】Vue3 組件通信方式詳解

前言 毫無疑問&#xff0c;組件通信是Vue中非常重要的技術之一&#xff0c;它的出現能夠使我們非常方便的在不同組件之間進行數據的傳遞&#xff0c;以達到數據交互的效果。所以&#xff0c;學習組件通信技術是非常有必要的&#xff0c;本文將總結Vue中關于組件通信的八種方式…

代碼隨想錄算法訓練營DAY49|300.最長遞增子序列、 674. 最長連續遞增序列、718. 最長重復子數組

300.最長遞增子序列 題目鏈接&#xff1a;300.最長遞增子序列dp初始化為1&#xff08;最小子序列長度為1&#xff09; class Solution(object):def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""dp [1]*len(nums)result …

leetcode-18- [669]修剪二叉搜索樹[108]將有序數組轉換為二叉搜索樹[538]把二叉搜索樹轉換為累加樹

重點&#xff1a;一般二叉樹多考慮遍歷順序&#xff0c; 二叉搜索樹多考慮特性&#xff0c;不用考慮遍歷順序。 一、[108]將有序數組轉換為二叉搜索樹 左閉右開 偶數取左邊 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums,0, nums…