【LeetCode 熱題100】二叉樹構造題精講:前序 + 中序建樹 有序數組構造 BST(力扣105 / 108)(Go語言版)

🌱 二叉樹構造題精講:前序 + 中序建樹 & 有序數組構造 BST

本文圍繞二叉樹的兩類構造類題目展開解析:

    1. 從前序與中序遍歷序列構造二叉樹
    1. 將有序數組轉換為二叉搜索樹

我們將從「已知遍歷構造樹」和「平衡構造 BST」兩個角度,拆解樹結構的構建邏輯,徹底吃透構造題型。


📌 題目一:105. 從前序與中序遍歷序列構造二叉樹

📝 題目描述

給定兩棵樹的遍歷序列:

  • preorder(前序遍歷):根 -> 左 -> 右
  • inorder(中序遍歷):左 -> 根 -> 右

請根據這兩種遍歷構造原始二叉樹。


🔍 解題思路

核心思路:

  1. 前序遍歷的第一個元素一定是根節點;
  2. 在中序遍歷中找到這個根節點的位置,可以確定左右子樹的元素范圍;
  3. 遞歸構造左右子樹。

? 解法:遞歸構造

func buildTree(preorder []int, inorder []int) *TreeNode {inMap := map[int]int{}for i, val := range inorder {inMap[val] = i}var build func(pl, pr, il, ir int) *TreeNodebuild = func(pl, pr, il, ir int) *TreeNode {if pl > pr || il > ir {return nil}rootVal := preorder[pl]root := &TreeNode{Val: rootVal}idx := inMap[rootVal]leftSize := idx - ilroot.Left = build(pl+1, pl+leftSize, il, idx-1)root.Right = build(pl+leftSize+1, pr, idx+1, ir)return root}return build(0, len(preorder)-1, 0, len(inorder)-1)
}

📘 思路詳解

  • 使用 inMap 來快速定位中序中某個值的位置,避免每次線性搜索;
  • 用索引控制遍歷范圍,不要切片傳參,會影響性能
  • 每次遞歸縮小當前處理的 preorder 和 inorder 區間。

?? 注意事項:

  • preorder[pl] 是當前子樹的根節點;
  • 左子樹的大小為 idx - il
  • 左右子樹遞歸時注意索引邊界不要寫錯。

📌 題目二:108. 將有序數組轉換為二叉搜索樹

📝 題目描述

給你一個升序排序的整數數組,請你將其轉化為一棵高度平衡的二叉搜索樹(BST)


🔍 解題思路

關鍵點:

  • 數組有序 → 可用中間元素構建根節點;
  • 左邊遞歸為左子樹,右邊遞歸為右子樹;
  • 中間元素選擇策略:可以取中間偏左或偏右均可。

? 解法:遞歸 + 中點分割

func sortedArrayToBST(nums []int) *TreeNode {var build func(left, right int) *TreeNodebuild = func(left, right int) *TreeNode {if left > right {return nil}mid := (left + right) / 2root := &TreeNode{Val: nums[mid]}root.Left = build(left, mid-1)root.Right = build(mid+1, right)return root}return build(0, len(nums)-1)
}

💭 思維補充

  • 二叉搜索樹要求:左 < 根 < 右;
  • 高度平衡樹要求:每個節點左右子樹高度差不超過 1;
  • 因此「中間作為根」是構造平衡 BST 的最優策略。

🧠 總結 & 對比

題目類型輸入輸出核心操作
105構造普通二叉樹前序 + 中序遍歷樹結構遞歸 + 分治(索引控制)
108構造平衡 BST有序數組BST 樹結構遞歸 + 二分中點

🎯 通用構造套路小結:

  1. 明確根節點從何而來(前序 or 中點);
  2. 找到左右子樹的邊界
  3. 索引控制子問題的范圍
  4. 構建節點,遞歸處理左右子樹;
  5. 特別注意邊界條件與 base case

? 進階思考

  • 如果輸入是 中序 + 后序,你還能反推出樹嗎?
  • 如果輸入是 BST + 任意遍歷,你能判斷樹結構嗎?

這些問題都是構造類題目的常見變體,建議從這兩題出發逐步拓展思維路徑。


下一篇將帶你探索搜索樹相關的問題,從驗證 BST 到查找第 K 小元素,一起掌握搜索樹的價值!

如有幫助,歡迎點贊收藏,更多結構題內容持續更新中 🧠💡


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

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

相關文章

JMeter重要的是什么

重要特性 支持多種協議&#xff1a; JMeter支持對多種協議進行性能測試&#xff0c;包括HTTP、HTTPS、FTP、JDBC&#xff08;數據庫&#xff09;、LDAP、JMS、SOAP、REST等。這使得它能夠適應各種不同的測試場景。強大的負載模擬能力&#xff1a; JMeter能夠模擬大量的虛擬用戶…

一文讀懂WPF系列之MVVM

WPF MVVM 什么是MVVMWPF為何使用MVVM機制WPFMVVM 的實現手段 INotifyPropertyChanged?數據綁定的源端通知??原理 PropertyChanged事件雙向綁定的完整條件常見疑惑問題 什么是MVVM 翻譯全稱就是 model-view-viewmodel 3部分內容 以wpf的概念角度來解釋就是 數據庫數據源模型…

OCR API識別對比

OCR 識別DEMO OCR識別 demo 文檔由來 最開始想使用百度開源的 paddlepaddle大模型 研究了幾天&#xff0c;發現表格識別會跨行&#xff0c;手寫識別的也不很準確。最終還是得使用現成提供的api。。 文檔說明 三個體驗下來 騰訊的識別度比較高&#xff0c;不論是手寫還是識別表…

嵌入式MCU常用模塊

日后填坑。 無線通信模塊 2.4G 基本介紹 以NRF24L01為例。 NRF24L01是一款2.4GHz的無線收發模塊&#xff0c;支持SPI通信協議&#xff0c;具有低功耗、高數據速率&#xff08;250kbps-2Mbps&#xff09;和多設備通信能力。 它可以同時與最多6個其他模塊通信&#xff0c;適合…

記一次InternVL3- 2B 8B的部署測驗日志

測試效果&#xff1a; 問題和耗時如圖 5、資源占用 不釋放資源會一直漲顯存。總體還算滿意&#xff0c;我試了好多個圖理解大模型&#xff0c;就屬它牛一點 附圖一張 補充&#xff0c;測試InternVL3-2B的結果 1、模型下載魔搭社區 2、運行環境&#xff1a; 1、硬件 RTX 30…

Java版本對應關系表

Java版本對應關系表 以下Java主要版本&#xff08;Major Version&#xff09;與公開大版本號的對應關系 公開大版本名稱Major 版本號內部版本號格式示例&#xff08;java -version輸出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安裝教程(保姆級)

Flink支持多種安裝模式。 local&#xff08;本地&#xff09;——本地模式 standalone——獨立模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 standaloneHA—獨立集群高可用模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 yarn——計算資源統一…

android11 配置默認電池優化白名單

目錄 1.介紹 2.讀取配置文件 3.默認配置一個白名單列表 1.介紹 在 Android 11 中,DeviceIdleController 是負責控制設備進入 Doze 模式(閑置模式) 的核心系統服務,其內部方法 readConfigFileLocked() 負責從配置文件中讀取 Doze 模式的行為參數,包括 idle 階段的時間間…

java中的Future的設計模式 手寫一個簡易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一個蛋糕有點儀式感&#xff0c;于是去蛋糕店預定&#xff0c;預定完之后&#xff0c;店老板說蛋糕做好了&#xff0c;到時電話通知你&#xff0c;不可能在這傻傻的等著吧&#xff0c;還有其他事情要做啊&#xff0c;于…

【Redis】Redis C++使用

一、Redis的自定義網絡協議 1.1 為什么可以編寫出一個自定義的Redis客戶端 為什么我們可以編寫出一個自定義的Redis客戶端&#xff1f;因為Redis公開了自己的自定義協議。而對于一些其他軟件的客戶端&#xff0c;我們無法編寫出一個自定義的Redis客戶端&#xff0c;因為他們沒…

【軟考系統架構設計師】軟件工程知識點

1、 軟件開發生命周期 軟件定義時期&#xff1a;包括可行性研究和詳細需求分析過程&#xff0c;任務是確定軟件開發工程必須完成的總目標&#xff0c;具體分為問題定義、可行性研究、需求分析等 軟件開發時期&#xff1a;軟件的設計與實現&#xff0c;分為概要設計、詳細設計、…

DeepSeek 與開源:肥沃土壤孕育 AI 碩果

當國產 AI DeepSeek 以其低成本推理和多模態能力在全球范圍內引起轟動時&#xff0c;人們驚嘆于中國技術的迅猛發展&#xff0c;卻很少有人深究這一成就背后的根基。答案其實早已寫在中國開源生態二十多年的發展歷程中。 從倪光南院士提出“以開源打破技術壟斷”的理念&#x…

職坐標:智慧城市未來發展的核心驅動力

內容概要 智慧城市的演進正以顛覆性創新重構人類生存空間&#xff0c;其發展脈絡由物聯網、人工智能與云計算三大技術支柱交織而成。這些技術不僅推動城市治理從經驗決策轉向數據驅動模式&#xff0c;更通過實時感知與智能分析&#xff0c;實現交通、能源等領域的精準調控。以…

vue復習46~90

1.小兔鮮 所有都折疊 ctrl k,ctrl0 所有都展開 ctrl k,ctrlj當前結構渲染5次 <BaseBrandItem v-for"item in 5" :key"item"><BaseBrandItem>2.scoped樣式沖突 結構&#xff1a;只能有一個根元素樣式&#xff1a;全局樣式(默認)&#xff1…

PHP 用 workman 即時通訊,做個簡版QQ

1. workman是什么 &#xff0c;一般應用在那些地方 workerman是一個高性能的PHP socket 服務器框架&#xff0c;workerman基于PHP多進程以及libevent事件輪詢庫&#xff0c;PHP開發者只要實現一兩個接口&#xff0c;便可以開發出自己的網絡應用&#xff0c;例如Rpc服務、聊天室…

【WORD】批量將doc轉為docx

具體步驟進行&#xff1a; 打開Word文檔&#xff0c;按下AltF11快捷鍵&#xff0c;打開VBA編輯器。在VBA編輯器中&#xff0c;左側的“項目資源管理器”窗口會顯示當前打開的Word文檔相關項目。找到您要添加代碼的文檔項目&#xff08;通常以文檔名稱命名&#xff09;&#xf…

【免費】【實測有用】5KPlayer Windows 電腦作為 MacBook 無線擴展屏

總結&#xff1a;使用 5KPlayer 將 Windows 電腦作為 MacBook 無線擴展屏 準備工作 設備要求&#xff1a; MacBook 和 Windows 電腦需連接到同一 Wi-Fi 網絡。【這里有雷&#xff1a;eduroam不會成功&#xff0c;家里的WIFI成功了&#xff0c;需要確認校園網是否可行。】確保…

華為華三模擬器解決兼容問題Win11 24H2 現在使用ENSP的問題解決了

一、Win11 24H2 現在使用ENSP的問題解決了 這個Win11 的 24H2不能使用ENSP的問題已經困擾我們很久了,在之前的文章中,我們也有說明這個問題 之前ENSP肯定啟動會報錯40 當時還建議大家先不要更新到win11的24H2版本,現在終于迎來了更新,不用再擔心了,包括早就升級了24H2版…

嵌入式WebRTC輕量化SDK壓縮至500K-800K ,為嵌入式設備節省Flash資源

一、SDK輕量化的核心技術實現 1、WebRTC庫裁剪與模塊化設計 EasyRTC針對嵌入式設備的資源限制&#xff0c;對原生WebRTC庫進行深度裁剪&#xff0c;僅保留核心通信功能&#xff08;如信令管理、編解碼、網絡傳輸等&#xff09;&#xff0c;移除冗余組件&#xff08;如部分調試…

Maya云渲染工作流,提升渲染速度

在三維動畫與影視特效領域&#xff0c;Autodesk Maya作為行業標桿工具&#xff0c;承載著從角色建模到復雜特效渲染的全流程創作。然而&#xff0c;本地硬件性能不足、渲染周期漫長、跨團隊協作效率低等痛點始終困擾著創作者。渲染101云渲染以彈性算力資源、智能化工作流與全方…