LeetCode 熱題 100 105. 從前序與中序遍歷序列構造二叉樹

LeetCode 熱題 100 | 105. 從前序與中序遍歷序列構造二叉樹

大家好,今天我們來解決一道經典的二叉樹問題——從前序與中序遍歷序列構造二叉樹。這道題在 LeetCode 上被標記為中等難度,要求根據給定的前序遍歷和中序遍歷序列,構造并返回二叉樹的根節點。


問題描述

給定兩個整數數組 preorderinorder,其中 preorder 是二叉樹的先序遍歷,inorder 是同一棵樹的中序遍歷,請構造二叉樹并返回其根節點。

示例 1:

輸入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
輸出: [3,9,20,null,null,15,7]

示例 2:

輸入: preorder = [-1], inorder = [-1]
輸出: [-1]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorderinorder 均無重復元素
  • inorder 均出現在 preorder
  • preorder 保證為二叉樹的前序遍歷序列
  • inorder 保證為二叉樹的中序遍歷序列

解題思路

核心思想
  1. 前序遍歷

    • 前序遍歷的第一個元素是根節點。
    • 使用前序遍歷的第一個元素在中序遍歷中找到根節點的位置,從而將中序遍歷分為左子樹和右子樹。
  2. 遞歸構造

    • 遞歸地構造左子樹和右子樹。

Python代碼實現

class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:if not preorder or not inorder:return None# 前序遍歷的第一個元素是根節點root_val = preorder[0]root = TreeNode(root_val)# 在中序遍歷中找到根節點的位置mid_idx = inorder.index(root_val)# 遞歸構造左子樹和右子樹root.left = self.buildTree(preorder[1:mid_idx + 1], inorder[:mid_idx])root.right = self.buildTree(preorder[mid_idx + 1:], inorder[mid_idx + 1:])return root

代碼解析

  1. 基本情況

    • 如果 preorderinorder 為空,直接返回 None
  2. 構造根節點

    • 使用 preorder 的第一個元素作為根節點的值。
  3. 找到根節點在中序遍歷中的位置

    • 使用 inorder.index(root_val) 找到根節點在中序遍歷中的位置。
  4. 遞歸構造左子樹和右子樹

    • 使用中序遍歷的分割點,遞歸地構造左子樹和右子樹。
  5. 返回根節點

    • 返回構造好的根節點。

復雜度分析

  • 時間復雜度:O(n),其中 n 是樹中節點的數量。每個節點被訪問一次。
  • 空間復雜度:O(n),遞歸調用棧的深度最多為樹的高度。

示例運行

示例 1
輸入:preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
輸出:[3,9,20,null,null,15,7]
示例 2
輸入:preorder = [-1], inorder = [-1]
輸出:[-1]

總結

通過遞歸方法,我們可以高效地從前序和中序遍歷序列構造二叉樹。遞歸地找到根節點在中序遍歷中的位置,從而將中序遍歷分為左子樹和右子樹。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!

關注我,獲取更多算法題解和編程技巧!

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

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

相關文章

CSS- 1.1 css選擇器

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 系…

MongoClient和AsyncIOMotorClient的區別和用法

示例代碼&#xff1a; from motor.motor_asyncio import AsyncIOMotorClient from pymongo import MongoClient&#x1f50d; 這兩個庫分別是&#xff1a; 名字說明舉個例子pymongo.MongoClient同步版 的 MongoDB 客戶端&#xff08;常規阻塞式操作&#xff09;你在主線程里一…

5.15打卡

浙大疏錦行 DAY 26 函數專題1 知識點回顧&#xff1a; 1. 函數的定義 2. 變量作用域&#xff1a;局部變量和全局變量 3. 函數的參數類型&#xff1a;位置參數、默認參數、不定參數 4. 傳遞參數的手段&#xff1a;關鍵詞參數 5. 傳遞參數的順序&#xff1a;同時出現三種參數…

針對面試-mysql篇

1.如何定位慢查詢? 1.1.介紹一下當時產生問題的場景(我們當時的接口測試的時候非常的慢&#xff0c;壓測的結果大概5秒鐘))&#xff0c;可以監測出哪個接口&#xff0c;最終因為是sql的問題 1.2.我們系統中當時采用了運維工具(Skywalking就是2秒&#xff0c;一旦sql執行超過2秒…

window 顯示驅動開發-報告圖形內存(三)

圖形內存報告示例 示例 1&#xff1a;筆記本電腦上的 128 MB 專用板載圖形內存 以下屏幕截圖顯示了使用 Intel Iris 離散圖形適配器運行 Windows 11 的 Surface 筆記本電腦的計算圖形內存數。 適配器的可用內存總數為 16424 MB&#xff0c;用于圖形用途&#xff0c;細分如下&…

極簡主義現代商務風格PPT模版6套一組分享下載

現代商務風格PPT模版下載https://pan.quark.cn/s/12fbc52124d9 第一張PPT模版&#xff0c;簡約風&#xff0c;橄欖綠背景&#xff0c;黑色豎條裝飾&#xff0c;文字有中英文標題和占位符。需要提取關鍵元素&#xff1a;簡約、橄欖綠、對稱布局、占位文本的位置。 風格?&#…

SpringBoot中10種動態修改配置的方法

在SpringBoot應用中&#xff0c;配置信息通常通過application.properties或application.yml文件靜態定義&#xff0c;應用啟動后這些配置就固定下來了。 但我們常常需要在不重啟應用的情況下動態修改配置&#xff0c;以實現灰度發布、A/B測試、動態調整線程池參數、切換功能開…

嵌入式自學第二十二天(5.15)

順序表和鏈表 優缺點 存儲方式&#xff1a; 順序表是一段連續的存儲單元 鏈表是邏輯結構連續物理結構&#xff08;在內存中的表現形式&#xff09;不連續 時間性能&#xff0c; 查找順序表O(1)&#xff1a;下標直接查找 鏈表 O(n)&#xff1a;從頭指針往后遍歷才能找到 插入和…

高并發內存池(三):TLS無鎖訪問以及Central Cache結構設計

目錄 前言&#xff1a; 一&#xff0c;thread cache線程局部存儲的實現 問題引入 概念說明 基本使用 thread cache TLS的實現 二&#xff0c;Central Cache整體的結構框架 大致結構 span結構 span結構的實現 三&#xff0c;Central Cache大致結構的實現 單例模式 thr…

Ubuntu 安裝 Docker(鏡像加速)完整教程

Docker 是一款開源的應用容器引擎&#xff0c;允許開發者打包應用及其依賴包到一個輕量級、可移植的容器中。本文將介紹在 Ubuntu 系統上安裝 Docker 的步驟。 1. 更新軟件源 首先&#xff0c;更新 Ubuntu 系統的軟件源&#xff1a; sudo apt update2. 安裝基本軟件 接下來…

【深度學習】數據集的劃分比例到底是選擇811還是712?

1 引入 在機器學習中&#xff0c;將數據集劃分為訓練集&#xff08;Training Set&#xff09;、驗證集&#xff08;Validation Set&#xff09;和測試集&#xff08;Test Set&#xff09;是非常標準的步驟。這三個集合各有其用途&#xff1a; 訓練集 (Training Set)&#xff…

Mysql刷題 day01

LC 197 上升的溫度 需求&#xff1a;編寫解決方案&#xff0c;找出與之前&#xff08;昨天的&#xff09;日期相比溫度更高的所有日期的 id 。 代碼&#xff1a; select w2.id from Weather as w1 join Weather as w2 on DateDiff(w2.recordDate , w1.recordDate) 1 where…

鴻蒙OSUniApp 制作個人信息編輯界面與頭像上傳功能#三方框架 #Uniapp

UniApp 制作個人信息編輯界面與頭像上傳功能 前言 最近在做一個社交類小程序時&#xff0c;遇到了需要實現用戶資料編輯和頭像上傳的需求。這個功能看似簡單&#xff0c;但要做好用戶體驗和兼容多端&#xff0c;還是有不少細節需要處理。經過一番摸索&#xff0c;總結出了一套…

科技的成就(六十八)

623、杰文斯悖論 杰文斯悖論是1865年經濟學家威廉斯坦利杰文斯提出的一悖論&#xff1a;當技術進步提高了效率&#xff0c;資源消耗不僅沒有減少&#xff0c;反而激增。例如&#xff0c;瓦特改良的蒸汽機讓煤炭燃燒更加高效&#xff0c;但結果卻是煤炭需求飆升。 624、代碼混…

榮耀手機,系統MagicOS 9.0 USB配置沒有音頻來源后無法被adb檢測到,無法真機調試的解決辦法

榮耀手機&#xff0c;系統MagicOS 9.0 USB配置沒有音頻來源后無法被adb檢測到&#xff0c;無法真機調試的解決辦法 前言環境說明操作方法 前言 一直在使用的uni-app真機運行榮耀手機方法&#xff0c;都是通過設置USB配置的音頻來源才能成功。突然&#xff0c;因為我的手機的系…

D-Pointer(Pimpl)設計模式(指向實現的指針)

Qt 的 D-Pointer&#xff08;Pimpl&#xff09;設計模式 1. Pimpl 模式簡介 Pimpl&#xff08;Pointer to Implementation&#xff09;是一種設計模式&#xff0c;用于將類的接口與實現分離&#xff0c;從而隱藏實現細節&#xff0c;降低編譯依賴&#xff0c;提高代碼的可維護…

MySQL 8.0 OCP 1Z0-908 101-110題

Q101.which two queries are examples of successful SQL injection attacks? A.SELECT id, name FROM backup_before WHERE name‘; DROP TABLE injection; --’; B. SELECT id, name FROM user WHERE id23 oR id32 OR 11; C. SELECT id, name FROM user WHERE user.id (SEL…

Vue ElementUI原生upload修改字體大小和區域寬度

Vue ElementUI原生upload修改字體大小和區域寬度 修改后 代碼 新增的修改樣式代碼 .upload-demo /deep/ .el-upload-dragger{width: 700px;height: 300px; }原有拖拽組件代碼 <!-- 拖拽上傳組件 --><el-uploadclass"upload-demo"dragaction"":m…

React和Vue在前端開發中, 通常選擇哪一個

React和Vue的選擇需結合具體需求&#xff1a; 選React的場景 大型企業級應用&#xff0c;需處理復雜狀態&#xff08;如電商、社交平臺&#xff09;團隊熟悉JavaScript&#xff0c;已有React技術棧積累需要高度靈活的架構&#xff08;React僅專注視圖層&#xff0c;可自由搭配…

Python爬蟲實戰:研究源碼還原技術,實現逆向解密

1. 引言 在網絡爬蟲技術實際應用中,目標網站常采用各種加密手段保護數據傳輸和業務邏輯。傳統逆向解密方法依賴人工分析和調試,效率低下且易出錯。隨著 Web 應用復雜度提升,特別是 JavaScript 混淆技術廣泛應用,傳統方法面臨更大挑戰。 本文提出基于源碼還原的逆向解密方法…