【代碼隨想錄day 16】 力扣 106.從中序與后序遍歷序列構造二叉樹

視頻講解:https://www.bilibili.com/video/BV1vW4y1i7dn/?vd_source=a935eaede74a204ec74fd041b917810c
文檔講解:https://programmercarl.com/0106.%E4%BB%8E%E4%B8%AD%E5%BA%8F%E4%B8%8E%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣題目:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

通過中序遍歷與后續遍歷來構造二叉樹要注意的是

  1. 先確定根節點,也就是后序遍歷的最后一個元素
  2. 根據根節點的值將中序遍歷分為左中序和右中序,左中序就是左子樹,右中序就是右子樹。
  3. 根據左中序的長度可以在后序遍歷中找到左后序的長度,同時得到右后序的長度,在其找出根節點,循環切割中序遍歷和后序遍歷
  4. 當切割的數組長度為1時就是最后一個根節點了,也就是遍歷到了葉子節點,返回root
  5. 如果便利的數組長度為0,則證明是空樹,直接返回空即可。
class Solution {
public:
TreeNode *traversal(vector<int>&inorder,vector<int>&postorder)
{//如果遍歷數組長度為0,則為空樹if(postorder.size()==0) return NULL;//找到后序遍歷最后一個元素,就是當前的中間節點int rootValue = postorder[postorder.size()-1];TreeNode *root = new TreeNode(rootValue);//葉子節點if(postorder.size() == 1) return root;//找切割點int delimiterIndex;for(delimiterIndex=0; delimiterIndex< inorder.size();delimiterIndex++){if(inorder[delimiterIndex] == rootValue) break;}//切割 切成左中序和右中序vector<int > leftInorder(inorder.begin(),inorder.begin()+delimiterIndex);vector<int> rightInorder(inorder.begin()+delimiterIndex+1,inorder.end());//postorder舍棄末尾元素postorder.resize(postorder.size()-1);//切割后序數組  左后序  右后序vector<int> leftPostorder(postorder.begin(),postorder.begin()+leftInorder.size());vector<int> rightPostorder(postorder.begin()+leftInorder.size(),postorder.end());//開始遞歸root->left=traversal(leftInorder,leftPostorder);root->right=traversal(rightInorder,rightPostorder);//返回值return root;
}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//如果兩數組都為空,則樹為空if(inorder.size()==0 &&postorder.size()==0) return NULL;return traversal(inorder,postorder);}
};

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

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

相關文章

vue+flask大模型寫詩詩詞推薦與可視化系統

文章結尾部分有CSDN官方提供的學長 聯系方式名片文章結尾部分有CSDN官方提供的學長 聯系方式名片關注B站&#xff0c;有好處&#xff01;編號&#xff1a; F061 大模型詩詞推薦與可視化系統 在傳統文化數字化的浪潮下&#xff0c;我開發了這款詩歌問答大數據平臺&#xff0c;旨…

Apache Ignite 核心組件:GridClosureProcessor解析

這是一個 Apache Ignite 中非常核心的組件 —— GridClosureProcessor&#xff0c;它是 分布式閉包&#xff08;Closure&#xff09;執行的調度中樞&#xff0c;負責在集群節點上異步執行用戶提交的任務&#xff08;如 Runnable、Closure&#xff09;。 我們來逐層深入理解它的…

for循環詳解與實戰技巧

目錄 一、for循環語法 二、for循環執行流程 流程圖表示&#xff1a; 三、for循環實踐示例 示例&#xff1a;在屏幕上打印1~10的值 四、while循環與for循環對比 for循環和while循環都包含三個關鍵部分&#xff1a; 兩者的主要區別在于代碼組織方式&#xff1a; 五、練習…

winform中的listbox實現拖拽功能

文章目錄前言一、實現前言 winform中的listBox實現拖拽&#xff01; 一、實現 winform中的listbox實現拖拽只需要實現四個事件 1、準備兩個listbox控件 其中listtarget&#xff0c;AllowDrop屬性設置為True。 2、實現四個事件 2.1MouseDown //在 MouseDown 事件期間&#x…

用 Docker 安裝并啟動 Redis:從入門到實戰

用 Docker 安裝并啟動 Redis&#xff1a;從入門到實戰Redis 作為一款高性能的鍵值對數據庫&#xff0c;在緩存、會話存儲、消息隊列等場景中被廣泛應用。本文將詳細介紹如何使用 Docker 快速安裝和啟動 Redis&#xff0c;包括基礎配置、數據持久化以及容器管理等核心操作&#…

ansible學習第一天

一&#xff1a;ansible基礎知識1.1 ansible的定義與工作原理簡述ansible是一個自動化運維工具&#xff0c;用于執行自動化任務&#xff0c;包括像配置管理&#xff0c;應用部署&#xff0c;任務執行等等&#xff0c;本質上來說也是基礎設施及代碼工具&#xff0c;通過可讀性較強…

Vue原理與高級開發技巧詳解

Vue 的底層原理、高級用法、性能優化和生態整合 文章目錄Vue 的底層原理、高級用法、性能優化和生態整合一、Vue 雙向綁定原理深度剖析1. Vue 2 實現原理&#xff08;Object.defineProperty&#xff09;2. Vue 3 實現原理&#xff08;Proxy&#xff09;3. v-model 高級用法二、…

axios的封裝

axios的封裝 在src目錄下新建文件夾utils工具類&#xff0c;文件夾里面新建http.js文件&#xff0c;如果項目涉及到多個基地址可以新建http2.js文件。 import axios from axios;/*** 后端*/// 創建axios實例 const http axios.create({// 1.接口基地址baseURL: http://192.168…

MariaDB 數據庫管理與web服務器

MariaDB 數據庫管理與WEB 服務器 介紹 MariaDB 數據庫介紹 **數據庫&#xff0c;是一個存放計算機數據的倉庫。**這個倉庫是按照一定的數據結構來對數據進行組織和存儲的&#xff0c;我們可以通過數據庫提供的多種方法來管理其中的數據。 數據結構&#xff0c;是指數據的組織形…

分治-歸并-912.排序數組-力扣(LeetCode)

一、題目解析1、將數組排升序2、在不使用任何內置函數的情況下解決問題二、算法原理分治-歸并合并兩個有序數組1、雙指針遍歷兩個合并數組2、將比較后的較小值放到新開數組中3、防止有指針未遍歷完&#xff0c;特殊處理4、將nums中的元素還原三、代碼示例vector<int> tmp…

網絡安全初學者學習心得

看到你對網絡安全學習的興趣&#xff0c;我感到非常振奮&#xff01;這個領域既充滿挑戰又回報豐厚&#xff0c;作為初學者&#xff0c;理清學習內容和方向確實至關重要。下面我將結合多年的行業觀察和指導經驗&#xff0c;為你詳細拆解網絡安全初學者的學習內容并分享一些核心…

防火墻筆記優化版

一、防火墻的核心定義防火墻是一種基于預設安全策略&#xff0c;用于隔離內網與外網、控制網絡流量的安全系統&#xff08;可分為軟件系統或硬件系統&#xff09;。其核心作用包括&#xff1a;流量隔離&#xff1a;物理或邏輯分隔內網、外網及 DMZ 區域&#xff08;DMZ 為內網與…

vue3前端項目cursor rule

cursor rule是什么&#xff0c;以及怎么定義&#xff0c;看這個文章&#xff1a; cursor中定義cursor rules_cursor rules如何編寫-CSDN博客 針對現有一個vue3的前端項目&#xff0c;寫了一份cursor rule&#xff0c;可以作為參考&#xff0c;內容如下&#xff08;僅作為參考&…

基于51單片機紅外遙控定時開關智能家電插座設計

1. 功能介紹 本設計是一款基于 STC8C52 單片機 的智能家電插座系統&#xff0c;集 紅外遙控控制、定時開關控制、自動與手動模式切換、掉電數據保存、液晶顯示、蜂鳴器提示 于一體&#xff0c;能夠方便用戶對家用電器進行精準的定時控制與遠程操作。系統廣泛適用于家用電器、辦…

下一代防火墻組網方案

知識回顧&#xff1a;1.傳統防火墻包括包過濾防火墻、應用網關防火墻、狀態檢測防火墻。2.包過濾防火墻工作在3、4層。3.包過濾防火墻特點&#xff1a;4.應用網關防火墻主要作用&#xff1a;①截取用戶初始化連接請求&#xff0c;對用戶進行認證&#xff1b;②通過ALG能讓多通道…

WEB開發-第二十七天(PHP篇)

DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS開發 PHPStorm : 專業PHP開發IDE PhpStudy &#xff1a;Apache MYSQL環境 Navicat Premium: 全能數據庫管理工 變量覆蓋安全&#xff1a; $GLOBALS&#xff1a;這種全局變量用于在PHP腳本中的任意位置訪…

Lwip深度閱讀-網絡架構

LWIP網絡協議棧詳細介紹 本文的內容基本基于野火的LWIP手冊&#xff0c;和LWIP源碼撰寫。 網絡協議棧概述 從圖片可以看出&#xff0c;網絡協議棧采用分層架構&#xff0c;每一層都有特定的功能和協議。 TCP/IP協議分層模型數據封裝過程MAC數據包 我使用wireShark抓包的時候&am…

嵌入式系統學習Day16(C語言中的位運算)

位運算二進制位的運算嵌入式:通過位運算 控制 硬件運算: 運算規則 & 與 一假則假 | 或 一真則真 ~ 非 真假相對 ^ 異或 相同為假 不同為真 << 左移 表示二進制位的移動 >> 右移 eg:int a 0x55; int b 0x33;0101 0101 //0x55 &am…

Endnote下載,導入曼大 harvard_manchester格式

下載endnote 并激活中國農業科技文獻與信息服務平臺&#xff0c;點擊下載 下載harvard_manchester 格式 Harvard Manchester - Referencing guide at the University of Manchester - Subject guides at University of Manchester 雙擊打開第二步下載的安裝包&#xff08;使用…

【Docker進階實戰】從多容器編排到集群部署

Docker進階實戰&#xff1a;從多容器編排到集群部署 當你已經熟悉Docker的基本操作后&#xff0c;面對的下一個挑戰往往是&#xff1a;如何管理多個容器的協作&#xff1f;如何實現容器的集群化部署與擴展&#xff1f;如何保證服務的高可用&#xff1f; 一、Docker Compose&…