力扣106:從中序與后序遍歷序列構造二叉樹

力扣106:從中序與后序遍歷序列構造二叉樹

  • 題目
  • 思路
  • 代碼

題目

給定兩個整數數組 inorder 和 postorder ,其中 inorder 是二叉樹的中序遍歷, postorder 是同一棵樹的后序遍歷,請你構造并返回這顆 二叉樹 。
在這里插入圖片描述

思路

我們首先要知道中序遍歷和后序遍歷分別都是什么。
中序遍歷是依照左子樹,根節點,右子樹的順序來進行遍歷。
后序遍歷是依照左子樹,右子樹,根節點的順序來進行遍歷。
我們觀察這兩個遍歷得到的數組看能得到什么信息,首先最明顯的是我們通過后序遍歷可以確定整個二叉樹的根節點也就是后序數組的最后一個位置除此之外也沒啥了,接下來是中序數組,中序數組乍一看沒啥信息可言但是我們來看其中根節點的位置,再看它的左邊和右邊我們可以發現整個數組我們只要確定了根節點的位置就可以劃分成三部分:左子樹,根節點和右子樹。那么再找到左子樹和右子樹的根節點不就可以繼續劃分下去了嗎直到根節點是一個葉子節點沒有左子樹和右子樹。這不就是分治的思想嗎,先進行拆分再進行組合。所以這道題我們可以使用分治來做,從根節點開始構建節點然后再構建左子樹再構建右子樹,同樣左子樹的根節點繼續構建它的兩個子樹。
在這個過程中我們必須要有兩個信息:每次構建時根節點的值以及左右子樹在中序數組的范圍。
首先是根節點的值,這個我們可以通過后序數組來得到,右子樹的根節點下標我們只需要在當前的下標進行–就可以得到了,重點是左子樹的根節點的下標。

代碼

/*** 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:unordered_map<int,int> um;TreeNode* merge(int root,int left,int right,vector<int>& postorder){//結束的條件是左子樹的下標不小于右子樹if(left > right){return nullptr;}//構建節點TreeNode* node = new TreeNode(postorder[root]);//得到root位置在中序遍歷的下標int i = um[postorder[root]];//構建左子樹和右子樹//重點解釋一下左子樹的根節點怎么找//我們肯定也是在后序數組中找其次后序是左,右,根的順序//左子樹的根節點和當前樹的根節點只差了一個右子樹的長度//所以我們通過中序數組來找到右子樹的長度也就是right-i//因為right是有邊界,i是根節點在中序數組的下標所以right-i就是右子樹的長度//在減去右子樹的數量后我們還需要減1node->left = merge(root-(right-i)-1,left,i-1,postorder);node->right = merge(root-1,i+1,right,postorder);return node;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//通過后序遍歷我們可以確定根節點的位置//通過中序遍歷我們可以得到該節點的左子樹和右子樹//所以我們可以使用分治的辦法將一棵樹從根節點開始向下構建for(int i = 0;i < inorder.size();i++){//記錄在中序遍歷中節點的值所對應的下標um[inorder[i]] = i;}return merge(postorder.size()-1,0,inorder.size()-1,postorder);}
};

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

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

相關文章

IDEA JAVA工程入門

Maven配置&#xff1a; IDEA -> settings -> Build, Execution, Deployment -> Build Tools -> MavenMaven home pathUser setting file : 特定倉庫下載依賴包&#xff0c;自動下載(界面右邊M圖標點開&#xff0c;)local repository &#xff08;本地倉庫&#xff…

Spring依賴注入:從原理到實踐的自學指南

Spring依賴注入&#xff1a;從原理到實踐的自學指南 一、什么是依賴注入&#xff1f; 依賴注入&#xff08;Dependency Injection, DI&#xff09;是Spring框架實現控制反轉&#xff08;IoC&#xff09;的核心手段。其核心思想是&#xff1a;對象不再自己創建依賴項&#xff…

3_軟件重構_組件化開發實例方法論

1、上期回顧上次內容核心的地方有兩個&#xff0c;①是C多態基類的指針指向派生類&#xff0c;用于初始化各個插件。②是使用C語言的dlopen函數“動態加載”各個插件&#xff0c;實現用戶根據契約接口自定義開發插件&#xff0c;極大程度地實現了軟件上的解耦。③再進一步&…

C#接口的定義與使用

第1章 接口&#xff08;interface&#xff09;是什么1.1 定義? 接口是一組“能力”或“契約”的抽象描述&#xff0c;只規定“能做什么”&#xff0c;不規定“怎么做”。? 在 C# 中&#xff0c;接口是一種完全抽象的類型&#xff08;fully abstract type&#xff09;。 ? 關…

【STM32】HAL庫中的實現(三):PWM(脈沖寬度調制)

&#x1f527; HAL庫中的實現&#xff1a;PWM&#xff08;脈沖寬度調制&#xff09; PWM&#xff08;Pulse Width Modulation&#xff09;是基于定時器&#xff08;TIM&#xff09;產生的周期性脈沖信號&#xff0c;廣泛應用于&#xff1a;① 電機調速&#xff1b;② LED 亮度控…

GitHub 趨勢日報 (2025年08月03日)

&#x1f680; GitHub 趨勢日報 (2025年08月03日) &#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖751dyad362LLMs-from-scratch291…

Java后端高頻面試題

Java后端高頻面試題 目錄 Java集合框架Java并發編程JVM相關MySQL數據庫Redis緩存Spring框架 Java集合框架 HashMap的數據結構是什么&#xff0c;為什么在JDK8要引入紅黑樹&#xff1f; HashMap數據結構&#xff1a; JDK7&#xff1a;數組 鏈表JDK8&#xff1a;數組 鏈表…

37. line-height: 1.2 與 line-height: 120% 的區別

概述 line-height 是 CSS 中用于控制文本行間距的重要屬性。雖然 line-height: 1.2 和 line-height: 120% 看似相同&#xff0c;但它們在計算方式上存在關鍵區別&#xff0c;尤其是在繼承和計算值方面。1. 計算方式不同寫法類型計算方式說明line-height: 1.2無單位&#xff08;…

藍橋杯----DS1302實時時鐘

&#xff08;六&#xff09;、DS1302實時時鐘1、原理&#xff08;圖 二十六&#xff09;DS1302通過三線串行接口與單片機進行通信。微控制器可以通過設置RST引腳為高電平來使能DS1302&#xff0c;并通過SCK引腳提供串行時鐘信號&#xff0c;然后通過I/O引腳進行數據的讀寫操作。…

C++對象訪問有訪問權限是不是在ide里有效

在C中&#xff0c;對象的訪問權限&#xff08;即公有&#xff08;public&#xff09;、保護&#xff08;protected&#xff09;和私有&#xff08;private&#xff09;成員的訪問&#xff09;是編譯時的一部分&#xff0c;而不是運行時。這意味著&#xff0c;無論是在IDE&#…

CubeMX安裝芯片包

1.點擊HELP2.選擇公理嵌入式軟件包3.選擇并下載芯片包

【面向對象】面向對象七大原則

設計模式 設計模式是什么&#xff1f; 設計模式是一種針對于反復提出問題的解決方案&#xff0c;是經過長時間經驗和試錯而總結出來的一套業務流程&#xff1b; 其目的是為了提高代碼的可重用性和可維護性&#xff0c;讓代碼更容易讓人理解&#xff0c;保證代碼可靠性&#…

《計算機“十萬個為什么”》之 面向對象 vs 面向過程:編程世界的積木與流水線

《計算機“十萬個為什么”》之 面向對象 vs 面向過程&#xff1a;編程世界的積木與流水線 &#x1f916; 想象你要造一輛汽車&#x1f527;&#xff1a; 面向過程 按手冊一步步擰螺絲&#xff1a;擰緊螺栓A → 安裝輪胎B → 焊接車架C 面向對象 召喚汽車人戰隊&#xff1a;引…

Visual Studio Code (VSCode) 的常用快捷鍵

Visual Studio Code (VSCode) 的常用快捷鍵可極大提升開發效率。以下是分類整理的 **核心快捷鍵**&#xff08;基于 **Windows/Linux** 系統&#xff0c;macOS 用戶將 Ctrl 替換為 Cmd&#xff0c;Alt 替換為 Option&#xff09;&#xff1a;? 基礎操作快捷鍵功能Ctrl N新建文…

vite面試題及詳細答案120題(01-30)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Cesium學習(一)-基礎

Cesium是一個開源的JavaScript庫&#xff0c;專門用于創建3D地球和地圖可視化。它在GIS、航空航天、城市規劃等領域有廣泛應用。 Cesium核心特性3D地球可視化 基于WebGL的高性能3D渲染支持全球地形和影像數據準確的地球模型&#xff08;WGS84橢球體&#xff09;多維數據支持 時…

餓了么招java開發咯

研發工程師-JAVA/Golang&#xff08;崗位信息已經過jobleap.cn授權&#xff0c;可以在CSDN發布&#xff09;餓了么 杭州收錄時間&#xff1a; 2025年08月05日職位描述1、參與基礎軟件的設計、開發和維護&#xff0c;如分布式中間件、DevOps平臺、應用監控系統等&#xff1b; 2…

java web 未完成項目,本來想做個超市管理系統,前端技術還沒學。前端是個簡單的html。后端接口比較完善。

代碼結構 超市管理系統/├── src/ │ ├── com/ │ │ └── zhang/ │ ├── documents.txt │ ├── documents_detail.txt │ ├── goods.txt │ ├── order.txt │ ├── order_detail.txt │ ├── role.txt │ ├── tb_test.txt │ …

R語言基礎圖像及部分調用函數

R語言基礎圖像及部分調用函數 散點圖 散點圖是將所有的數據以點的形式展現在直角坐標系上&#xff0c;以顯示變量之間的相互影響程度&#xff0c;點的位置由變量的數值決定&#xff0c;每個點對應一個 X 和 Y 軸點坐標。 散點圖可以使用 plot() 函數來繪制 例子 x<-c(10,40)…

自由學習記錄(77)

官方模版、、都不用了&#xff0c;記得之前用gitextension 的時候也好像有這種問題&#xff0c;也不知道怎么回事 用自己的就行了 網上說什么都沒用&#xff0c;還是要自己老實寫&#xff0c;配上截圖工具截屏目錄直接轉文字過去&#xff0c;其實字都不要打多少的 一張很深刻…