代碼隨想錄刷題day53|(二叉樹篇)106.從中序與后序遍歷序列構造二叉樹(▲

目錄

一、二叉樹理論知識

二、構造二叉樹思路

2.1 構造二叉樹流程(給定中序+后序

2.2 整體步驟

2.3 遞歸思路

2.4?給定前序和后序

三、相關算法題目

四、易錯點


一、二叉樹理論知識

詳見:代碼隨想錄刷題day34|(二叉樹篇)二叉樹的遞歸遍歷-CSDN博客

二、構造二叉樹思路

2.1 構造二叉樹流程(給定中序+后序

給定中序和后序的節點值構造唯一二叉樹:

中序:左中右:9 3 15 20 7

后序:左右中:9 15 7 20 3

由后序可知:最后一個結點 3 一定為根節點? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?9 15 7 20 3

由中序可知:左子樹為 9 右子樹為 15 20 7? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??9 3 15 20 7

由后序可知:左子樹的根節點為 9 (也只有唯一一個結點?9?)右子樹的根節點為 20?

由中序可知:右子樹的左節點為 15? ?右節點為 7

2.2 整體步驟

1.如果后序數組為空,則說明遍歷結束;

2.后序數組最后一個元素為(根)結點元素;

3.在中序數組中尋找對應結點元素,作為切割點,分割左右子樹;

4.切割中序數組,切成左右區間;

5.切割后序數組:根據中序數組中的左右區間,再去切割后序數組中的左右區間;

6.然后遞歸處理切割后的左區間和右區間;

2.3 遞歸思路

1.遞歸函數返回值和參數

返回構造好的根節點,參數:中序數組和后序數組;

2.終止條件

后序數組為空,返回為空,假設后序數組長度=中序數組長度,不考慮其他異常情況;

3.單層遞歸邏輯

處理特殊情況:如果后序數組長度為1,則說明這棵樹只有一個結點,即為根節點又為葉子節點;

首先獲取后序數組中最后一個結點的值val;

遍歷中序數組,找到val所在的下標位置index;

根據index切割中序數組,得到左中序數組、右中序數組;

根據左中序數組的大小和右中序數組的大小來切割后序數組,得到左后序數組、右后序數組;

根據左中序和左后序遞歸處理左子樹,右中序和右后序遞歸處理結點的右子樹;

最后返回根節點;

一定先切中序,分開左右,再去切后序,否則后序無法分開左右;

2.4?給定前序和后序

不可以

因為只能找出根節點,但是分不開左右區間,構造二叉樹一定要有中序遍歷的數組;

三、相關算法題目

106.從中序與后序遍歷序列構造二叉樹

class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {return backtracking(inorder,postorder);}private TreeNode backtracking(int[] inorder, int[] postorder){if(postorder.length == 0 || inorder.length == 0){return null;}TreeNode root = new TreeNode();root.val = postorder[postorder.length - 1];if(postorder.length == 1){return root;}int index = 0;for(int i = 0;i < inorder.length;i++){if(inorder[i] == postorder[postorder.length - 1]){index = i;break;}}//切割中序數組 得到左中序數組int[] leftInorder = Arrays.copyOfRange(inorder,0,index);//得到右中序數組int[] rightInorder = Arrays.copyOfRange(inorder,index + 1,inorder.length);//切割后序數組 得到左后序數組int[] leftPostorder = Arrays.copyOfRange(postorder,0,leftInorder.length);//得到右后序數組int[] rightPostorder = Arrays.copyOfRange(postorder,leftInorder.length,postorder.length - 1);//遞歸處理左子樹 根據左中序和左后序root.left = backtracking(leftInorder,leftPostorder);//遞歸處理右子樹 根據右中序和右后序root.right = backtracking(rightInorder,rightPostorder);return root;}
}

四、易錯點

1.判斷后序數組和中序數組長度是否為0,要放在遞歸函數中,否則當左子樹為空時,遞歸到下一層,即根結點的左子樹時,后序數組已為空,長度為0,但此時不進行長度為0的校驗,那么通過 后序數組的長度-1 來獲取根節點的值 就會報錯:

ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 0

2.獲取左中序、右中序、左后序、右后序數組時,起始索引和終止索引要注意,起始索引包括,中止索引不包括,右后序中,終止索引要考慮去掉后序數組中的最后一個結點(根節點),即 postorder.length - 1;

3.優化建議:

  • 可以用?HashMap?預處理?inorder?的值到索引的映射,避免每次遞歸都遍歷查找?index

  • 可以用索引范圍代替數組拷貝,減少空間開銷(傳遞?inorder?和?postorder?的起始和結束索引,而不是拷貝數組)。

4.切數組的時候 注意區間的定義,左閉右開,左閉右閉

一定打日志 來找問題? debug?就是把每一步劃分的數組打印出來看 printf

待續。。。。

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

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

相關文章

前端知識點---用正則表達式判斷郵箱(javascript)

// 全面的正則&#xff08;兼容大多數情況&#xff09; const emailRegex /^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$/;// 或直接使用瀏覽器內置驗證 <input type"email" required>/&#xff1a;正則表達式的起始和結束標志。 ^&#xff1a;匹配字符串的…

PyQt6實例_批量下載pdf工具_界面開發

目錄 前置&#xff1a; 代碼&#xff1a; 視頻&#xff1a; 前置&#xff1a; 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭&#xff0c;放在 【PyQt6實例】 專欄 2 本系列涉及到的PyQt6知識點&#xff1a; 線程池&#xff1a;QThreadPool,QRunnable&#xff1b; 信號…

在word中使用zotero添加參考文獻并附帶超鏈接

一、引言 在寫大論文時&#xff0c;為了避免文中引用與文末參考文獻頻繁對照、修改文中引用順序/引用文獻時手動維護參考文獻耗易出錯&#xff0c;擬在 word 中使用 zotero 插入參考文獻&#xff0c;并為每個參考文獻附加超鏈接&#xff0c;實現交互式閱讀。 版本&#xff1a…

Selenium文件上傳

在 Web 自動化測試中,文件上傳是一項常見的任務。不同的網站和前端技術可能導致上傳方式有所不同,因此需要采用不同的方法進行處理。 方法 1:使用 send_keys() 直接上傳(最常用) 適用場景: 頁面中 有標準的 <input type="file"> 標簽。 不需要彈出 Wind…

線程概念與控制(中)

線程概念與控制&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/146464905?sharetypeblogdetail&sharerId146464905&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我們經過上一篇的學習&#xff0c;接…

【Unity】 鼠標拖動物體移動速度跟不上鼠標,會掉落

錯誤示范&#xff1a; 一開始把移動的代碼寫到update里去了&#xff0c;發現物體老是掉(總之移動非常不流暢&#xff0c;體驗感很差&#xff09; void Update(){Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit, M…

MATLAB 控制系統設計與仿真 - 30

用極點配置設計伺服系統 方法2-反饋修正 如果我們想只用前饋校正輸入&#xff0c;從而達到伺服控制的效果&#xff0c;我們需要很精確的知道系統的參數模型&#xff0c;否則系統輸出仍然具有較大的靜態誤差。 但是如果我們在誤差比較器和系統的前饋通道之間插入一個積分器&a…

VMware Windows Tools 存在認證繞過漏洞(CVE-2025-22230)

漏洞概述 博通公司&#xff08;Broadcom&#xff09;近日修復了 VMware Windows Tools 中存在的一個高危認證繞過漏洞&#xff0c;該漏洞編號為 CVE-2025-22230&#xff08;CVSS 評分為 9.8&#xff09;。VMware Windows Tools 是一套實用程序套件&#xff0c;可提升運行在 VM…

羅杰斯特回歸

定義 邏輯回歸其實就是原來的線性回歸加了激活函數&#xff0c;這個函數其實就是sigmoid函數&#xff0c;把一個回歸的連續數值壓縮到了0到1的空間&#xff0c;其實只要有函數能夠滿足把數值壓縮到0,1之間就可以&#xff08;因為0到1之間的數值就是概率值&#xff09; 對于分類…

Java多線程與JConsole實踐:從線程狀態到性能優化!!!

目錄 一、前言二、JConsole 使用教程二、線程的基本狀態2.1新建狀態&#xff08;New&#xff09;2.2就緒狀態&#xff08;Ready&#xff09;2.3運行狀態&#xff08;Running&#xff09;2.4 阻塞狀態&#xff08;Blocked&#xff09;2.5. 等待狀態&#xff08;Waiting&#xff…

基于django優秀少兒圖書推薦網(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;圖書推薦網當然不能排除在外。本次開發的優秀少兒圖書推薦網是在實際應用和軟件工程的開發原理之上&#xff0c;運用Python語言、爬蟲技術…

《網絡管理》實踐環節01:OpenEuler22.03sp4安裝zabbix6.2

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 1 環境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix網絡規劃&#xff08;用你們自己的特征網段規劃&#xff09; 主機名 IP 功能 備注 zbx6svr 19…

Axure項目實戰:智慧城市APP(七)我的、消息(顯示與隱藏交互)

親愛的小伙伴&#xff0c;在您瀏覽之前&#xff0c;煩請關注一下&#xff0c;在此深表感謝&#xff01; 課程主題&#xff1a;智慧城市APP 主要內容&#xff1a;我的、消息、活動模塊頁面 應用場景&#xff1a;消息頁設計、我的頁面設計以及活動頁面設計 案例展示&#xff…

晶晨S905L3A(B)-安卓9.0-開啟ADB和ROOT-支持IPTV6-支持外置游戲系統-支持多種無線芯片-支持救磚-完美通刷線刷固件包

晶晨S905L3A(B)-安卓9.0-開啟ADB和ROOT-支持IPTV6-支持外置游戲系統-支持多種無線芯片-支持救磚-完美通刷線刷固件包 適用型號&#xff1a;M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、UNT413A、M411A、E900V22C、E900V22D、IP112H等等晶晨S905L3A(B)處…

【免費】2007-2019年各省地方財政科學技術支出數據

2007-2019年各省地方財政科學技術支出數據 1、時間&#xff1a;2007-2019年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;行政區劃代碼、地區、年份、地方財政科學技術支出 4、范圍&#xff1a;31省 5、指標說明&#xff1a;地方財政科學技術支出是指地方…

樹形結構的工具類TreeUtil

這個地方是以null為根節點&#xff0c;相關以null或者0自己在TreeUtil中加代碼&#xff0c;就行 基礎類 package com.jm.common.entity;import lombok.Data;import java.util.ArrayList; import java.util.List;/*** Author:JianWu* Date: 2025/3/26 9:02*/ Data public clas…

視頻聯網平臺智慧運維系統:智能時代的城市視覺中樞

引言&#xff1a;破解視頻運維的"帕累托困境" 在智慧城市與數字化轉型浪潮中&#xff0c;全球視頻監控設備保有量已突破10億臺&#xff0c;日均產生的視頻數據量超過10萬PB。然而&#xff0c;傳統運維模式正面臨三重困境&#xff1a; 海量設備管理失序&#xff1a;…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加行拖拽排序功能示例9,TableView16_09 嵌套表格拖拽排序

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加行拖拽排序功能示例9,TableView16_09 嵌…

QML中使用Image顯示圖片和使用QQuickItem顯示圖片

在QML中顯示圖片時&#xff0c;Image元素和自定義QQuickItem有不同的特性和適用場景。以下是兩者的詳細對比及性能分析&#xff1a; 1. Image 元素 優點&#xff1a; 聲明式語法&#xff1a;簡單直觀&#xff0c;適合靜態圖片或簡單動態需求 Image {source: "image.png&…

【力扣刷題|第十七天】0-1 背包 完全背包

目標和 力扣題目網址:目標和 這道題我們先用回溯的思想來做。首先我們設正數和為S&#xff0c;數組和為N&#xff0c;目標值為T&#xff0c;那么S-(N-S)T化簡之后可以得S(TN)/2即選擇的正數個數為偶數&#xff0c;而且NT也為偶數&#xff0c;那么第一個判斷條件我們就有了&…