【筆試訓練】給一個數組構建二叉樹|從前序遍歷與中序遍歷構建二叉樹|二叉樹中的最大路徑和

文章目錄

  • 1.給一個數組構建二叉樹
  • 2.從前序遍歷和中序遍歷構建二叉樹
  • 3.二叉樹中的最大路徑和


1.給一個數組構建二叉樹

思路:就是借助一個隊列實現層序遍歷的思想。
先將root節點入隊列,構造左右節點后,root取出來時,將其左右孩子都入隊列。

struct TreeNode
{unique_ptr<TreeNode> left;unique_ptr<TreeNode> right;int _val;TreeNode(int val):_val(val),left(nullptr),right(nullptr){}~TreeNode(){}
};//層序遍歷構建二叉樹
// 1 2 3 4 5
unique_ptr<TreeNode> BuildBinaryTreeFromLevelOrder(vector<int>& nums)
{if (nums.size() == 0){cout << "nums is empty!" << endl;}unique_ptr<TreeNode> root = make_unique<TreeNode>(nums[0]);queue<TreeNode*> q;q.push(root.get());int i = 1;while (!q.empty() && i < nums.size()){TreeNode* cur = q.front();q.pop();//先處理左子樹cur->left = make_unique<TreeNode>(nums[i]);q.push(cur->left.get());i++;//再處理右子樹if (i < nums.size()){cur->right = make_unique<TreeNode>(nums[i]);q.push(cur->right.get());}i++;}return root;
}

2.從前序遍歷和中序遍歷構建二叉樹

從前序遍歷和中序遍歷構建二叉樹

在這里插入圖片描述

思路:

  • 1.根據前序遍歷的根,先找到中序遍歷的根節點所在下標。
  • 2.然后劃分成兩個區間進行遞歸即可。

注意事項:
previ是前序中的根節點下表,用來構建當前節點的。
所以構建完根節點后, 需要++previ,到達左子樹的根節點。
并且要傳引用。否則回到當前遞歸棧這一層時,會從原位置開始向下走

class Solution {
public:TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& previ,int inbegin,int inend){if(inbegin > inend)return nullptr; //子區間遞歸結束了TreeNode* root = new TreeNode(preorder[previ]);//1.先在中序區間找根節點下標int rooti = 0;while(rooti <= inend){if(preorder[previ] == inorder[rooti])break;++rooti;}//2.分成左右子區間分別構建子樹。++previ; //根節點的下一個節點就是左子樹的根了root->left = _buildTree(preorder,inorder,previ,inbegin,rooti-1);//這里不要再++prei,因為遞歸構建左子樹時,會自己++prei,構建左子樹的最后//一個節點時,會先++prei,就到右子樹了。root->right = _buildTree(preorder,inorder,previ,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//根據前序遍歷的根,先找到中序遍歷的根節點所在下標。//然后劃分成兩個區間進行遞歸即可。int previ = 0; //傳參時一定是傳引用,否則回到當前遞歸棧這一層時//會從原位置開始向下走int inbegin = 0,inend = inorder.size()-1;return _buildTree(preorder,inorder,previ,inbegin,inend);}
};

3.二叉樹中的最大路徑和

二叉樹中的最大路徑和
在這里插入圖片描述

思路:二叉樹中一條路的最大路徑和一定是該節點的左子樹的最大有效值與右子樹的最大有效值的最大值的和,再加上當前節點的值。
所以:

  • 1.先求出左右子樹的最大有效值,再加上當前節點的值。
  • 2.求有效值的過程,不斷更新最大路徑和。

這里注意兩個概念:

  • 1.最大貢獻值是因為左子樹可能有幾十條路徑,需要選出最優的路徑,才是最大的貢獻。
    左右子樹的最大貢獻值加起來,再加上我當前節點的值之后,才組成最大路徑和(左右都是最優的路徑)。我的左子樹和右子樹兩條路徑選出來,比較后,選最大的,再加上我當前節點的值,然后向上交付,就能組成一條最優的路徑。
  • 2.最大路徑和就是:左右子樹的最大貢獻值,加上我當前節點的值,就組成了一條完整的路徑。

別看這道題是困難題,如果想明白了后序遍歷,就一點不難。

class Solution {int max_val = INT_MIN; //保存最大的路徑和
public:int _paxPathSum(TreeNode* root){if(root == nullptr)return 0; //空節點的有效值為0//保存左右子樹的最大貢獻值int left_con = max(_paxPathSum(root->left),0);int right_con = max(_paxPathSum(root->right),0);//更新最大路徑和max_val = max(max_val,left_con + right_con + root->val);//返回貢獻值return root->val + max(left_con,right_con);}int maxPathSum(TreeNode* root) {_paxPathSum(root);return max_val;}
};

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

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

相關文章

Swift實戰:如何優雅地從二叉搜索樹中挑出最接近的K個值

文章目錄 摘要描述題解答案題解代碼分析示例測試及結果時間復雜度空間復雜度總結未來展望 摘要 在日常開發中&#xff0c;我們經常會遇到“在一堆數據中找出最接近某個值”的需求。尤其在搜索引擎、推薦系統或者地理坐標匹配中&#xff0c;這種“最近匹配”的問題非常常見。Le…

Linux512 ssh免密登錄 ssh配置回顧

下載MX 官網 參考 OK 登個tom試試 然后再計劃登個RealServer 計劃再用僅主機網卡試試 連不上 看來要通過JumpServer再聯 通過網卡訪問 被踢掉了 成功通過跳板機JumpServer登入到RealServer 方法一免密登錄 現計劃嘗試方法二 只有1個tom 我連了兩個tom 看來是根據IP劃…

編譯原理AST以Babel為例進行解讀、Webpack中自定義loader與plugin

AST樹詳解 編譯原理 主要研究如何將高級編程語言的源代碼轉換為機器能理解的目標代碼&#xff08;通常是二進制代碼或中間代碼&#xff09;。編譯器的底層實現通常包含多個階段&#xff0c;包括詞法分析、語法分析、語義分析和代碼生成。 一、AST的核心概念與作用 AST&#…

51c大模型~合集127

我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架構 圖解Vllm V1系列2 本文詳細介紹了vllm v1的Executor-Workers架構&#xff0c;包括Executor的四種類型&#xff08;mp、ray、uni、external_launcher&#xff09;及其適用場景&#xff…

《Effective Python》第1章 Pythonic 思維詳解——深入理解流程控制中的解構利器match

《Effective Python》第1章 Pythonic 思維詳解——深入理解流程控制中的解構利器match 引言 Python 3.10 引入了全新的 match 語句&#xff0c;它不僅是一個“類 switch”的語法結構&#xff0c;更是一種**結構化模式匹配&#xff08;structural pattern matching&#xff09…

Nacos源碼—8.Nacos升級gRPC分析五

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 7.服務端對服務實例進行健康檢查 (1)服務端對服務實例進行健康檢查的設計邏輯 (2)服務端對服務實例進行健康檢查的源碼 (3)服務端檢查服務實例不健康后的注銷處理 (…

[手寫系列]Go手寫db — — 完整教程

[手寫系列]Go手寫db ZiyiDB是一個簡單的內存數據庫實現&#xff0c;支持基本的SQL操作&#xff0c;包含create、insert、delete、select、update、drop。目前一期暫支持int類型以及字符類型數據&#xff0c;后續會支持更多數據結構以及能力。本項目基于https://github.com/eato…

十三、動態對象創建(Dynamic Object Creation)

十三、動態對象創建&#xff08;Dynamic Object Creation&#xff09; 目錄 13.1 對象創建&#xff08;Object creation&#xff09;13.2 new / delete 操作符13.3 數組的 new 與 delete13.4 總結 背景說明 有時候我們需要知道程序中對象的數量、類型和聲明周期&#xff0c;…

一、網絡基礎

IPv4&#xff1a;32位二進制 -- 點分十進制標識 192.168.1.1&#xff08;連續的32位&#xff0c;為了好看方便每8位一段&#xff09; IPv6&#xff1a;128位二進制 IP&#xff08;Internet協議&#xff09; 洪泛&#xff1a;除流量進入接口外的所有接口的復制 OSI模型&#…

前端面試測試題目(一)

一、Vue的雙向綁定機制&#xff08;v-model底層實現原理&#xff09; Vue的雙向綁定核心由 響應式系統 和 指令語法糖 共同實現&#xff0c;具體原理如下&#xff1a; 響應式系統 Vue通過數據劫持和依賴收集實現數據變化到視圖的同步&#xff1a; ? 數據劫持&#xff1a;在Vue…

我用Deepseek + 亮數據爬蟲神器 1小時做出輿情分析器

我用Deepseek 亮數據爬蟲神器 1小時做出輿情分析器 一、前言二、Web Scraper API 實戰&#xff08;1&#xff09;選擇對應的URL&#xff08;2&#xff09;點擊進入對應url界面&#xff08;3&#xff09;API結果實例和爬取結果展示&#xff08;4&#xff09;用戶直接使用post請…

機器學習實戰:歸一化與標準化的選擇指南

在機器學習實戰中——是否需要歸一化&#xff08;Normalization&#xff09;或標準化&#xff08;Standardization&#xff09;&#xff0c;取決于所使用的模型類型。 ? LightGBM / XGBoost 是否需要歸一化或標準化&#xff1f; 不需要。 &#x1f527; 原因&#xff1a; L…

磁珠特點,原理與應用

什么是磁珠&#xff1f; 磁珠在1930年由日本東京工業大學的加藤與五郎和武井武兩位教授發明&#xff0c;TDK首次生產&#xff0c;是電感的一種&#xff0c;區別就是&#xff1a;電感外面包裹著鐵氧體材質。 因鐵氧體具有高電阻率&#xff0c;低渦流損耗&#xff0c;高頻時依舊…

【連載14】基礎智能體的進展與挑戰綜述-多智能體系統設計

基礎智能體的進展與挑戰綜述 從類腦智能到具備可進化性、協作性和安全性的系統 【翻譯團隊】劉軍(liujunbupt.edu.cn) 錢雨欣玥 馮梓哲 李正博 李冠諭 朱宇晗 張霄天 孫大壯 黃若溪 在基于大語言模型的多智能體系統&#xff08;LLM-MAS&#xff09;中&#xff0c;合作目標和合…

React Native踩坑實錄:解決NativeBase Radio組件在Android上的兼容性問題

React Native踩坑實錄&#xff1a;解決NativeBase Radio組件在Android上的兼容性問題 問題背景 在最近的React Native項目開發中&#xff0c;我們的應用在iOS設備上運行良好&#xff0c;但當部署到Android設備時&#xff0c;進入語言設置和隱私設置頁面后應用崩潰。我們遇到了…

[Windows] 網絡檢測工具InternetTest v8.8.2.2503 單文件版_支持查詢IP_DNS_WIFI密碼一鍵恢復

InternetTest&#xff08;詳情請戳 官網 / 作者項目地址&#xff09;是一款免費開源的網絡檢測實用工具&#xff0c;其可實現監控、診斷互聯網網絡連接&#xff0c;例如進行 ping 測試、延遲測試、WiFi 密碼查看、IP 地址或域名信息查詢等算是搭建網站及服務器的實用維護工具。…

配置Hadoop集群-集群配置

以下是 Hadoop 集群的核心配置步驟&#xff0c;基于之前的免密登錄和文件同步基礎&#xff0c;完成 Hadoop 分布式環境的搭建&#xff1a; 1. 集群規劃 假設集群包含 3 個節點&#xff1a; master&#xff1a;NameNode、ResourceManagerslave1&#xff1a;DataNode、NodeMana…

Spring Bean有哪幾種配置方式?

大家好&#xff0c;我是鋒哥。今天分享關于【Spring Bean有哪幾種配置方式&#xff1f;】面試題。希望對大家有幫助&#xff1b; Spring Bean有哪幾種配置方式&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Spring Bean的配置方式主要有三種&#xff…

Webpack中Compiler詳解以及自定義loader和plugin詳解

Webpack Compiler 源碼全面解析 Compiler 類圖解析&#xff1a; 1. Tapable 基類 Webpack 插件系統的核心&#xff0c;提供鉤子注冊&#xff08;plugin&#xff09;和觸發&#xff08;applyPlugins&#xff09;能力。Compiler 和 Compilation 均繼承此類&#xff0c;支持插件…

HAProxy + Keepalived + Nginx 高可用負載均衡系統

1. 項目背景 在現代Web應用中&#xff0c;高可用性和負載均衡是兩個至關重要的需求。本項目旨在通過HAProxy實現流量分發&#xff0c;通過Keepalived實現高可用性&#xff0c;通過Nginx提供后端服務。該架構能夠確保在單點故障的情況下&#xff0c;系統仍然能夠正常運行&#…