二叉樹(中等題)

1、先序,中序遍歷確定二叉樹

105

方法一、

前提

  • ① 必須不能有重復元素
  • ② 只有先序+中序后序+中序才能實現唯一樹

思考要點:

  • 不要想著用for循環,遞歸一定更好解決
  • 輸入是vector,遞歸就得考慮傳入索引

class Solution {  
public:  // 輔助函數,構建子樹  TreeNode* build_subTree(vector<int>& preorder, unordered_map<int, int>& inorder_map, int pre_st, int in_st, int in_end) {  // 如果當前中序遍歷的起始位置大于結束位置,返回空指針  if (in_st > in_end) return nullptr;  // 創建根節點,使用前序遍歷數組中的當前元素  TreeNode* root = new TreeNode(preorder[pre_st]);  // 獲取當前根節點在中序遍歷中的索引  int inorderRootIndex = inorder_map[preorder[pre_st]];   // 遞歸構建左子樹  root->left = build_subTree(preorder, inorder_map, pre_st + 1, in_st, inorderRootIndex - 1);  // 遞歸構建右子樹  root->right = build_subTree(preorder, inorder_map, pre_st + (inorderRootIndex - in_st) + 1, inorderRootIndex + 1, in_end);  // 返回構建好的子樹根節點  return root;  }  // 主函數,構建二叉樹  TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {  // 創建一個哈希表,用于快速查找中序遍歷中每個值的索引  unordered_map<int, int> inorder_map;  for (int i = 0; i < inorder.size(); i++) {  inorder_map[inorder[i]] = i; // 存儲每個節點值到其索引的映射  }  // 調用輔助函數構建樹,初始始點為0,結束點為中序遍歷的最后一個索引  return build_subTree(preorder, inorder_map, 0, 0, inorder.size() - 1);  }  
};  

2、中序,后序確定二叉樹

在這里插入圖片描述

和上文的思路相似。

/**  * 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:  // 遞歸構建子樹的輔助函數  TreeNode* buildsubtree(vector<int>& postorder, unordered_map<int,int>& inorder_map, int post_end, int in_st, int in_end) {  if (in_st > in_end) return nullptr; // 如果當前子樹的中序范圍無效,返回空指針  TreeNode* root = new TreeNode(postorder[post_end]); // 取后序遍歷最后一個元素作為當前子樹的根節點  int inorder_root_index = inorder_map[postorder[post_end]]; // 找到根節點在中序遍歷中的索引  root->right = buildsubtree(postorder, inorder_map, post_end - 1, inorder_root_index + 1, in_end); // 遞歸構建右子樹  root->left = buildsubtree(postorder, inorder_map, post_end - (in_end - inorder_root_index) - 1, in_st, inorder_root_index - 1); // 遞歸構建左子樹  return root; // 返回當前構建的根節點  }  // 主函數,接受中序和后序遍歷數組并返回構建的二叉樹  TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {  unordered_map<int,int> inorder_map; // 用于存儲中序遍歷的元素及其索引  int len = postorder.size(); // 獲取后序遍歷數組的長度  for (auto i = 0; i < inorder.size(); i++) {  inorder_map[inorder[i]] = i; // 每個元素的值和對應的索引  }  return buildsubtree(postorder, inorder_map, len - 1, 0, len - 1); // 調用輔助函數從后序數組的最后一個元素開始構建樹  }  
};

有相同點:

  • 均為分左右子樹各自遞歸。
  • map都是由中序遍歷來擔任。只不過前序找根節點從前往后,后序則是從后往前

不同點:
前序是先構造左子樹;
后序是先構造右子樹。

root->right = buildsubtree(postorder, inorder_map, post_end - 1, inorder_root_index + 1, in_end); // 遞歸構建右子樹  
root->left = buildsubtree(postorder, inorder_map, post_end - (in_end - inorder_root_index) - 1, in_st, inorder_root_index - 1); // 遞歸構建左子樹  

3、二叉樹展開為鏈表

114
在這里插入圖片描述

二叉樹展開成為鏈表

114
在這里插入圖片描述

方法一、

用先序遍歷方法將樹讀出先,這里要掌握先序讀取樹,其中就要應用到引用&,不然遞歸會爆內存,然后再進行建樹

/*** 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:void front_read(TreeNode*root, queue<int>& next_one){if(root==nullptr)return;next_one.push(root->val);front_read(root->left,next_one);front_read(root->right,next_one);}void build_tree(TreeNode*root,queue<int>&front_num){if(front_num.size()>0){TreeNode* right_son = new TreeNode(front_num.front());root->right=right_son;front_num.pop();build_tree(root->right,front_num);}}void flatten(TreeNode* root) {if(root==nullptr)return;queue<int> front_num;front_read(root,front_num);root->left=nullptr;front_num.pop();  // 記得要把第一個去掉噢build_tree(root,front_num);}
};

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

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

相關文章

服務器通過 ollama 運行deepseek r1

1、服務器環境簡介 56核 CPU64G 內存無顯卡已安裝 Ollama 2、下載模型與配置 正常可以通過 ollama pull 或 ollama run 命令直接下載&#xff0c;但通常會遇到連接超時、找不到網址等總理。因此&#xff0c;可以使用國內的模型站進行下載&#xff0c;在這里使用魔塔查找模型…

java項目排查線上問題1111

1.磁盤容量不足&#xff1a; 應用拋出的異常信息&#xff1a;java.io.IOException: 磁盤空間不足 1.1 指令獲取磁盤狀態&#xff1a;df -h 1.2 獲取目錄下文件夾大小&#xff1a;du -sh * 1.3 獲取目錄下文件夾大小&#xff1a;ls -lh 可以找到最大的文件&#xff0c;如日…

js中 ES6 新特性詳解

ES6&#xff08;ECMAScript 2015&#xff09;是 JavaScript 的一次重大更新&#xff0c;引入了許多新的特性&#xff0c;使 JavaScript 代碼更加簡潔、可讀和高效。以下是 ES6 的主要新特性及其原理 1. let 和 const 關鍵字 原理解析 1.1 作用域 var 關鍵字的作用域&#xf…

深入理解設計模式之解釋器模式

深入理解設計模式之解釋器模式 在軟件開發的復雜世界中,我們常常會遇到需要處理特定領域語言的情況。比如在開發一個計算器程序時,需要解析和計算數學表達式;在實現正則表達式功能時,要解析用戶輸入的正則表達式來匹配文本。這些場景都涉及到對特定語言的解釋和執行,而解…

巧妙實現右鍵菜單功能,提升用戶操作體驗

在動態交互式圖庫中&#xff0c;右鍵菜單是一項能夠顯著提升用戶操作便捷性的功能。它的設計既要響應用戶點擊位置&#xff0c;又需確保菜單功能與數據操作緊密結合&#xff0c;比如刪除圖片操作。以下將通過一段實際代碼實現&#xff0c;展示從思路到實現的詳細過程。 實現右鍵…

??????????????如何使用函數指針來調用函數

在C和C編程中&#xff0c;函數指針是一種特殊類型的指針&#xff0c;它指向一個函數而不是一個變量。使用函數指針可以動態地調用不同的函數&#xff0c;這在實現回調函數、事件處理、策略模式等場景中非常有用。 以下是如何定義和使用函數指針來調用函數的步驟&#xff1a; 定…

KEGG條形圖繪制

原始數據 setwd("C:\\Users\\HUAWEI\\Desktop\\proteomic_WGCNA\\bacteria\\Eggnog\\KEGGhun") library(ggplot2) library(cols4all) dt <- read.csv("bacteria_KEGG.csv")dt$KEGG_Term <- factor(dt$KEGG_Term, levels rev(dt$KEGG_Term))#基礎富集…

My Metronome for Mac v1.4.2 我的節拍器 支持M、Intel芯片

應用介紹 My Metronome 是一款適用于 macOS 的專業節拍器應用程序&#xff0c;旨在幫助音樂家、作曲家、學生和任何需要精確節奏控制的人進行練習。無論是進行樂器練習、音樂創作還是演出排練&#xff0c;My Metronome 都能為用戶提供精準的節拍支持和靈活的功能&#xff0c;確…

宇樹科技13家核心零部件供應商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;發布最新人形機器人研報&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形機器人100&#xff1a;全球人形機器人產業鏈梳理&#xff09;。 Humanoid 100清單清單中…

Part 3 第十二章 單元測試 Unit Testing

概述 第十二章圍繞單元測試展開&#xff0c;闡述了單元測試的實踐與重要性&#xff0c;通過對比其他測試類型&#xff0c;突出其特點&#xff0c;還介紹了單元測試的最佳實踐、避免的反模式以及與測試替身相關的內容&#xff0c;為編寫高質量單元測試提供指導。 章節概要 1…

【Vite SVG 圖標方案:vite-plugin-svg-icons 指南】

&#x1f31f; Vite SVG 圖標方案&#xff1a;vite-plugin-svg-icons 指南 &#x1f4dc; 背景與痛點 &#x1f30d; 前端圖標演進史 1.0 &#x1f5bc;? 圖片圖標 → 2.0 &#x1f3ad; 字體圖標 → 3.0 &#x1f3a8; SVG 圖標傳統方案存在三大痛點&#xff1a; 字體圖標…

go flag參數 類似Java main 的args

兩部分內容 go run test1.go aa -name 123 1. 解析&#xff1a;aa -name 123 2. 解析&#xff1a;name 123 代碼 package mainimport ("log""os" )func main() {log.Println("main ...")if len(os.Args) > 0 {for index, arg : ra…

酒店旅游API:數據交互的隱形橋梁——以攜程API為例

一、API&#xff1a;酒店 和第三方服務無縫連接。 核心價值&#xff1a; 實時數據互通&#xff1a;房態、價格、庫存秒級同步。業務流程自動化&#xff1a;預訂、支付、確認全程無需人工干預。生態擴展&#xff1a;開發者可基于API構建定制化工具&#xff08;如比價插件、智能…

深入理解 JSP 與 Servlet:原理、交互及實戰應用

一、引言 在 Java Web 開發領域,JSP(JavaServer Pages)和 Servlet 是兩個至關重要的技術,它們共同構成了動態網頁開發的基礎。Servlet 作為服務器端的 Java 程序,負責處理客戶端請求并生成響應;而 JSP 則是一種簡化的 Servlet 開發方式,允許開發者在 HTML 頁面中嵌入 J…

【JavaScript】《JavaScript高級程序設計 (第4版) 》筆記-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 隨著 Web 瀏覽器能力的增加&#xff0c;其復雜性也在迅速增加。從很多方面看&#xff0c;現代 Web 瀏覽器已經成為構建于諸多規范之上、集不同 API 于一身的“瑞士軍刀”。瀏覽器規范的生態在某種程度上是混亂而無序的。一些規范如 HTML5&…

AI芯片的關鍵特征

AI芯片是專門為人工智能應用設計的芯片&#xff0c;以下是其應具備的關鍵特征&#xff1a; 強大的并行計算能力&#xff1a;AI任務如深度學習中的神經網絡訓練和推理&#xff0c;涉及大量矩陣運算和并行數據處理。AI芯片需有眾多計算單元&#xff08;如GPU的大量流處理器、ASIC…

go 模塊管理

go version 查看版本 go version go1.21.12 windows/amd64 需要保證:go的版本升級為1.11以上,go mod依賴的最底版本 go env 查看go的環境變量 go env 開啟go mod # 標識開啟go的模塊管理 set GO111MODULE=on GO111MODULE有三個值:off, on和auto(默認值)。 GO111M…

Unity 適用于單機游戲的紅點系統(前綴樹 | 數據結構 | 設計模式 | 算法 | 含源碼)

文章目錄 功能包括如何使用 功能包括 紅點數據本地持久化 如果子節點有紅點&#xff0c;父節點也要顯示紅點&#xff0c;父節點紅點數為子節點紅點數的和&#xff1b; 當子節點紅點更新時&#xff0c;對應的父節點也要更新&#xff1b; 當所有子節點都沒有紅點時&#xff0c…

使用API有效率地管理Dynadot域名,為域名部署DNS安全拓展(DNSSEC)

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

Web - JS基礎語法與表達式

概述 這篇文章主要介紹了 JavaScript 的基礎語法&#xff0c;包括代碼書寫位置、ERPL 環境、變量&#xff08;命名規則、默認值、初始化&#xff09;、數據類型&#xff08;基本和復雜&#xff0c;及各類型特點、轉換&#xff09;、表達式和運算符&#xff08;算數、特殊算數、…