Studying-代碼隨想錄訓練營day21| 669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹、二叉樹總結

第21天,二叉樹最后一篇,沖💪

目錄

669.修建二叉搜索樹

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

538.把二叉搜索樹轉換為累加樹

二叉樹總結


669.修建二叉搜索樹

文檔講解:代碼隨想錄修建二叉搜索樹

視頻講解:手撕修建二叉搜索樹

題目:

學習:

本題需要注意的點很多,不能夠輕易的就把節點刪除,首先:1.本題給出的最小邊界值和最大邊界值,不一定會存在樹中,只是提供一個區間大小,因此不能夠節點判斷是否等于low或者high。2.在找到小于low的值后不能夠直接將其刪除,因為它的右孩子不一定小于low,同理大于high的節點也不能直接刪除,還需要關注它的左孩子。3.在2的基礎上,也不能直接把右孩子返回,因為右孩子大于low的情況下,右孩子的左孩子還是可能會小于low需要刪除,因此還需要不斷的進行遍歷。(該情況如下圖所示,如果區間在[2,3]之間)

依據上述所說,來設計遞歸三部曲。

代碼:

//時間復雜度O(n)
//空間復雜度O(n)
class Solution {
public://確定返回值,本題需要重新構造二叉樹節點,因此使用返回值更加方便,當然也可以沒有返回值就需要手動進行左右孩子構造TreeNode* trimBST(TreeNode* root, int low, int high) {//確定終止條件if (root == nullptr) return nullptr;//確定單層遞歸邏輯(核心是將root轉移到low和high區間內)//1.當前值大于highif (root->val > high) {//在該節點左邊找尋是否有合適的值return trimBST(root->left, low, high);}//2.當前值小于lowif (root->val < low) {//在該節點右邊找尋是否有合適的值return trimBST(root->right, low, high);}//3.當前值在low和high區間內,但是還不能就此下定義,還需要判斷該節點左右孩子是否合格root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);//持續把修改后的節點返回上層return root;}
};

代碼:本題也能夠使用迭代法,且由于二叉搜索樹自帶遍歷條件,因此不需要額外空間。

//時間復雜度O(n)
//空間復雜度O(1)
class Solution {
public:TreeNode* trimBST(TreeNode* root, int L, int R) {if (!root) return nullptr;// 處理頭結點,讓root移動到[L, R] 范圍內,注意是左閉右閉while (root != nullptr && (root->val < L || root->val > R)) {if (root->val < L) root = root->right; // 小于L往右走else root = root->left; // 大于R往左走}TreeNode *cur = root;// 此時root已經在[L, R] 范圍內,處理左孩子元素小于L的情況while (cur != nullptr) {while (cur->left && cur->left->val < L) {cur->left = cur->left->right;}cur = cur->left;}cur = root;// 此時root已經在[L, R] 范圍內,處理右孩子大于R的情況while (cur != nullptr) {while (cur->right && cur->right->val > R) {cur->right = cur->right->left;}cur = cur->right;}return root;}
};

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

文檔講解:代碼隨想錄將有序數組轉換為二叉搜索樹

視頻講解:手撕將有序數組轉換為二叉搜索樹

題目:

學習:

注意本題需要構造的不僅是二叉搜索樹還需要是一顆平衡二叉樹。平衡二叉樹需要所有中間節點的左右孩子的高度差不大于1。

依據上述條件,又因為本題給的數組已經是一個升序排列的數組了,因此本題顯然是從中間節點進行構造,每次取數組的中間節點,即可構造出平衡的二叉搜索樹。注意如果數組是奇數,顯然選中間的節點,如果數組是偶數則中間的兩個節點選哪個都可以,只要統一就行,最后構造出的二叉樹會有所區別,這也是本題答案不唯一的原因。

代碼:

//時間復雜度O(n)
//空間復雜度O(n^2)
class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {//確定終止條件if(nums.size() == 0) return nullptr;//取中間值int mid = nums.size()/2;TreeNode* node = new  TreeNode(nums[mid]);//左區間vector<int> left(nums.begin(), nums.begin() + mid);//右區間vector<int> right(nums.begin() + mid + 1, nums.end());//分配左右子樹node->left = sortedArrayToBST(left);node->right = sortedArrayToBST(right);return node;}
};

代碼:不使用額外空間,下標確定數組區間

//時間復雜度O(n)
//空間復雜度O(n)遞歸產生的棧空間
class Solution {
public://不使用額外空間,下標法TreeNode* traversal(vector<int>& nums, int left, int right) {//確定終止條件(區間左閉右閉)if(left > right) return nullptr;//找到中間值int mid = left + (right - left)/2; //防止數值越界TreeNode* node = new TreeNode(nums[mid]);//左區間node->left = traversal(nums, left, mid - 1);//右區間node->right = traversal(nums, mid + 1, right);return node;}TreeNode* sortedArrayToBST(vector<int>& nums) {return traversal(nums, 0, nums.size() - 1);}
};

538.把二叉搜索樹轉換為累加樹

文檔講解:代碼隨想錄把二叉搜索樹轉換為累加樹

視頻講解:手撕把二叉搜索樹轉換為累加樹

題目:

學習:本題最重要的是需要找到它的規律,本題是將每個節點的新值轉變為等于原樹中大于或等于node.val的值之和。如果將二叉搜索樹通過中序遍歷轉化為數組來看的話,其實就是從后往前依次累加。因此本題應該采用的遍歷方法是反中序遍歷,通過右中左的遍歷順序,因此將節點值累加。

注意本題累加過程中,采用的是雙指針的方法,需要一個指向當前節點的前一個節點pre來保存上一個節點的累加和。

代碼:

//時間復雜度O(n)
//空間復雜度O(n)
class Solution {
public:TreeNode* pre = nullptr; //指向當前節點的前一個節點//本題不需要返回值,只用將當前值改變就行void traversal(TreeNode* root) {//終止條件if(root == nullptr) return;//本題的遍歷順序應該為右中左//右traversal(root->right);//中if(pre != nullptr) {root->val = root->val + pre->val;}pre = root;//左traversal(root->left);}TreeNode* convertBST(TreeNode* root) {traversal(root);return root;}
};

代碼:本題也能夠使用迭代法進行

//時間復雜度O(n)
//空間復雜度O(n)
class Solution {
private:int pre; // 記錄前一個節點的數值void traversal(TreeNode* root) {stack<TreeNode*> st;TreeNode* cur = root;while (cur != NULL || !st.empty()) {if (cur != NULL) {st.push(cur);cur = cur->right;   // 右} else {cur = st.top();     // 中st.pop();cur->val += pre;pre = cur->val;cur = cur->left;    // 左}}}
public:TreeNode* convertBST(TreeNode* root) {pre = 0;traversal(root);return root;}
};

二叉樹總結

對于二叉樹來說我們首先需要掌握的就是遞歸這一算法,確定遞歸三部曲掌握通過遞歸進行的二叉樹的前序遍歷、中序遍歷、后序遍歷的方法。

其次對于二叉樹來說,它的迭代方法同樣也很重要,遞歸由于其不斷遞歸的特殊性,稍有不慎就容易導致棧溢出,且問題相對于迭代法不好排查。因此掌握迭代法對于實際工程使用也十分重要。

這七天我們對二叉樹的遍歷方式,各種屬性,二叉樹的修改和構造都進行了詳細的練習。并且對二叉樹中一個重要的類型二叉搜索樹也進行了詳細的考察,二叉搜索樹自帶的遍歷順序,能夠便于解答很多問題,同時對二叉搜索樹進行中序遍歷能夠得到一個非遞減序列也是重要的性質之一。

總結來說:

  • 涉及到二叉樹的構造,無論普通二叉樹還是二叉搜索樹一定都是先構造中節點。

  • 求普通二叉樹的屬性,一般是后序,一般要通過遞歸函數的返回值做計算。(包括是否對稱,求最大深度,最小深度,有多少個節點,是否平衡,路徑問題,左葉子之和、左下角的值等)

  • 求二叉搜索樹的屬性,一定是中序了,要不白瞎了有序性了。

?二叉樹系列就這么完美結束了!

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

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

相關文章

【PySide6】Repeater 子控件分析

文章目錄 前言分析 前言 修改 Column 控件下使用 Repeater 生成的子控件&#xff0c;但是沒有 id 無法操作&#xff0c;使用 children 層層遞歸分析 分析 QML 代碼 // https://doc.qt.io/qt-6/qml-qtquick-column.htmlColumn {id: columnspacing: 2// 定義模型property var …

代碼隨想錄算法訓練營刷題復習10:二叉樹、二叉搜索樹復習2

二叉樹、二叉搜索樹 力扣題復習 110. 平衡二叉樹257. 二叉樹的所有路徑404. 左葉子之和513. 找樹左下角的值112.路徑之和113.路經總和ii450. 刪除二叉搜索樹中的節點701. 二叉搜索樹中的插入操作 110. 平衡二叉樹 左右子樹高度差要小于1 ->遞歸調用&#xff08;need新的函…

API-元素尺寸與位置

學習目標&#xff1a; 掌握元素尺寸與位置 學習內容&#xff1a; 元素尺寸與位置仿京東固定導航欄案例實現bilibili點擊小滑塊移動效果 元素尺寸與位置&#xff1a; 使用場景&#xff1a; 前面案例滾動多少距離&#xff0c;都是我們自己算的&#xff0c;最好是頁面滾動到某個…

[leetcode]圓圈中最后剩下的數字/ 破冰游戲

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

程序猿大戰Python——Python與MySQL交互一

pymysql模塊的安裝 目標&#xff1a;了解如何安裝pymysql模塊&#xff1f; 當要使用Python和MySQL數據庫進行交互&#xff0c;需要借助一個第三方模塊&#xff1a;pymysql。 在使用pymysql模塊前&#xff0c;先進行安裝&#xff1a; pip install pymysql 有時使用pip instal…

從零開始做題:有手就行

1 題目 2 解題 ARPHCR工具破解 得到flag DASCTF{2b3767763885a019b65bbfe9d1136c3b}

數據結構與算法筆記:高級篇 - 向量空間:如何實現一個簡單的音樂推薦系統?

概述 很多人喜都喜愛聽歌&#xff0c;以前我們用 MP3 聽歌&#xff0c;現在直接通過音樂 App 在線就能聽歌。而且&#xff0c;各種音樂 App 的功能越來越強大&#xff0c;不僅可以自己選歌聽&#xff0c;還可以根據你聽歌的喜好&#xff0c;給你推薦你可能會喜好的音樂&#x…

【WEB前端2024】3D智體編程:喬布斯3D紀念館-第49課-機器人自動跳舞

【WEB前端2024】3D智體編程&#xff1a;喬布斯3D紀念館-第49課-機器人自動跳舞 使用dtns.network德塔世界&#xff08;開源的智體世界引擎&#xff09;&#xff0c;策劃和設計《喬布斯超大型的開源3D紀念館》的系列教程。dtns.network是一款主要由JavaScript編寫的智體世界引擎…

DevExpress Office File API教程 - 如何使用AI服務增強Word文檔可訪問性和語言支持?

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫&#xff0c;不用安裝Microsoft Office&#xff0c;就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

使用隱式事件執行控制圖

什么是隱式事件&#xff1f; 隱式事件是圖表執行時發生的內置事件&#xff1a; 圖表喚醒 進入一個狀態 退出狀態 分配給內部數據對象的值 這些事件是隱式的&#xff0c;因為您沒有顯式地定義或觸發它們。隱式事件是它們發生的圖表的子級&#xff0c;僅在父圖表中可見。 隱式事…

【AI生成】海上風電中衛星網絡與無線自組網的應用分析

隨著可再生能源的不斷發展&#xff0c;海上風電作為其中的重要組成部分&#xff0c;在我國能源結構調整中占據越來越重要的地位。近年來&#xff0c;我國海上風電產業發展迅速&#xff0c;海上風電場數量和規模不斷擴大&#xff0c;相應地&#xff0c;海上風電運維和安全保障的…

git branch -a 不顯示遠程分支修復

使用git remote -v命令&#xff0c;查看所有的遠程倉庫及其URL如果沒有&#xff0c;說明沒有遠程倉庫&#xff0c;繼續往下走使用git remote add origin <url>命令來添加或修改遠程倉庫&#xff1a;其中<url>是遠程倉庫的正確URL&#xff0c;就是git項目的http的地…

實現Java中的圖像處理功能

實現Java中的圖像處理功能 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本篇文章中&#xff0c;我們將探討如何在Java中實現圖像處理功能。圖像處理是計算機…

Embedding的概念和展開

前言 本章&#xff0c;我們介紹一個非常細的細節技術。讓我們微調大模型的一些特性和能力。 在大模型的AI套路演化過程中&#xff0c;其實經歷了太多的技術革新和方式變化&#xff0c;Embedding其實也可能是其中一個高速湮滅的技術點之一。 對比LoRA現在大紅大紫&#xff0c…

每個 Node.js 開發人員都應該知道的13個庫(下)

7. Sequelize Mongoose是一個Node。基于js的MongoDB對象建模工具&#xff0c;通常被稱為對象數據建模&#xff08;ODM&#xff09;庫&#xff0c;它提供了諸如鉤子、模型驗證、連接和查詢等功能。 Mongoose為應用程序數據提供了一個基于模式的解決方案&#xff0c;它在應用程…

【JavaScript腳本宇宙】玩轉數據存儲:深入剖析提升 Web 應用程序性能的六大利器

從本地到云端&#xff1a;全面解析滿足各種需求的高性能 JavaScript 數據庫庫 前言 本文將介紹幾個流行的JavaScript數據庫庫&#xff0c;包括localForage、Dexie.js、PouchDB、LokiJS和NeDB。每個庫都有自己的特點和適用場景。通過比較它們的功能和使用方式&#xff0c;可以…

論文翻譯 | ITER-RETGEN:利用迭代檢索生成協同增強檢索增強的大型語言模型

論文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 檢索增強生成由于有望解決包括過時知識和幻覺在內的大型語言模型的局限性而引起廣泛關注。然而&#xff0c;檢索器很難捕捉相關性&#xff0c;尤…

BurpSuite2024.5.3專業版,僅支持Java21以上

01更新介紹 此版本引入了對 WebSocket 的 Burp Scanner 支持、對錄制的登錄編輯器的改進、WebSocket 匹配和替換規則以及許多性能改進。我們還刪除了一些冗余的掃描檢查。 Burp Scanner 對 WebSockets 的支持我們更新了內部代理的配置&#xff0c;以允許 WebSocket 流量。這使…

代碼隨想錄算法訓練營第五十一天| 115.不同的子序列、583. 兩個字符串的刪除操作、 72. 編輯距離

LeetCode 115.不同的子序列 題目鏈接&#xff1a;https://leetcode.cn/problems/distinct-subsequences/description/ 文章鏈接&#xff1a;https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]&#xff1a;以i-1…

Docker快速極簡配置nginx實現不同域名訪問分流

文章目錄 前言安裝配置使用鏡像拉取及環境配置修改代理文件編寫docker-compose文件啟動nginx代理 總結 前言 本文主要記錄如何使用docker安裝配置Nginx&#xff0c;如何使用Nginx把通過80、443端口訪問的請求根據域名分發到不同端口。那么什么是Nginx呢&#xff0c;下邊做個簡…