LeetCode Hard|124.二叉樹中的最大路徑和

力扣題目鏈接
題目解讀:
二叉樹路徑的定義即從1.任意節點出發,到達任意節點;2.該路徑至少包含一個節點,且不一定經過跟節點;3.求所有可能路徑和的最大值。
也就是說路徑途徑一個節點只能選擇來去兩個方向

考慮一個二叉樹單元

  1. 設計一個函數,它應該能為我們選擇左路徑還是右路徑,所以該函數應該把 a 傳入,然后遞歸調用 b 和 c ,計算 b + a 和 c + a,選擇較大的值作為返回值,然后拿到全局最大和。(這里我們很容易確定參數和返回值,并且能夠一探遞歸函數的單層遞歸邏輯)

  2. 需要注意的是,整個路徑的最大路徑和不一定經過根節點,所以我們的答案并不是根節點的返回值。

  3. 這里需要一個能夠記錄所有路徑和中最大值的全局變量,它即為全局最大和。只要我們拿到了剛才的較大路徑,應該把它更新到全局最大和中。(確定了一個重要的全局變量)

  4. 最后就是選擇 左中右,我們在得到 b 和 c 的遞歸值后計算 b + a + c 的值,如果比“左”和“右”大,就把它更新到全局最大和中。

特別討論:我們如何處理負數?
我們既然求的事最大和,如果我們把負數囊括進去,對我們的最大和只會是負增益,所以我們應該盡可能舍棄負數,直接用一個 max(0, x)。
注意:1.但是我們的函數中無論是向上連接 b 和 c,a 作為必經之地都是不能舍棄的;2.并且要保證全局最大和的初始值為 INT_MIN。
關于以上兩點,我們必須談到,如果三個節點都是 -1,a 會舍棄掉 b 和 c,但是在返回最終結果時, a 自己是不能被舍棄的,也就是說此時的最大路徑和只有 a 自己,即-1。

此時我們可以陸續寫一點代碼出來了,首先定義我們的遞歸函數:

int traversal(TreeNode* cur, int& maxSum) {}

好了,此時我們寫我們的主函數:

    int maxPathSum(TreeNode* root) {int maxSum = INT_MIN;traversal(root, maxSum);return maxSum;}

最后開始我們的重頭戲,遞歸函數

剛才遞歸三部曲我們已經走完了第一步:確定函數參數和返回值

第二步:確定終止條件。
這里的終止條件還是比較簡單的,就是遇到空節點了返回零:

        if (cur == nullptr) return 0;

第三步:確定單層遍歷的邏輯。

還記得我們剛才的思路嗎?先去遞歸找到左右路徑選哪個?

        int leftSum = max(0, traversal(cur->left, maxSum));int rightSum = max(0, traversal(cur->right, maxSum));sum = node->val + max(leftSum, rightSum);

在這里我們不得不說,如果我們選擇左右其中的一個,也就說明我們仍然需要往上去遍歷,此時我們應該把這個 sum 作為遞歸函數的返回值返回回去。

        int leftSum = max(0, traversal(cur->left, maxSum));int rightSum = max(0, traversal(cur->right, maxSum));return cur->val + max(leftSum, rightSum);

好了,我們現在需要選擇 左-中-右,此時我們的路已經被選死了,也就是說我們現在應該去處理中間節點(根節點)邏輯。

        int nodeSum = cur->val + leftSum + rightSum;maxSum = max(nodeSum, maxSum);

所以遞歸函數總體的代碼是:

        if (cur == nullptr) return 0;int leftSum = max(0, traversal(cur->left, maxSum));int rightSum = max(0, traversal(cur->right, maxSum));int nodeSum = cur->val + leftSum + rightSum;maxSum = max(nodeSum, maxSum);return cur->val + max(leftSum, rightSum);

總體代碼

class Solution {
public:int traversal(TreeNode* cur, int& maxSum) {if (cur == nullptr) return 0;int leftSum = max(0, traversal(cur->left, maxSum));int rightSum = max(0, traversal(cur->right, maxSum));int nodeSum = cur->val + leftSum + rightSum;maxSum = max(nodeSum, maxSum);return cur->val + max(leftSum, rightSum);}int maxPathSum(TreeNode* root) {int maxSum = INT_MIN;traversal(root, maxSum);return maxSum;}
};

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

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

相關文章

mongoose的個性化提取(字段篩選,數據據排序,數據截斷)

1.字段篩選 let BookModel mongoose.model(books,BookSchema);BookModel.find().select({name:1,author:1}).then((err,data) > {//回調返回數據if(err){console.log(err);return;}console.log(data);})//值為1表示顯示數據,為0表示不顯示數據 數據排序 BookMod…

2025年U.S.News世界大學排名前200榜單

近日,U.S. News公布了2025全球最佳院校排名,作為公認的四大世界高校排行榜,該排名主要圍繞著學術聲譽、學術成果等,因此備受訪問學者、聯合培養博士生及博士后申請者們青睞,知識人網小編特作介紹并發布排名前200的榜單…

使用Go語言實現高效的數據挖掘

隨著數據量的不斷增加以及各種數據類型的不斷涌現,數據挖掘技術變得越來越重要。在現代數據科學領域中,使用大量數據進行機器學習和其他挖掘任務已經成為常態。然而,在完成這些任務時,使用的編程語言對效率和結果都有著重要的影響…

我與C++的愛戀:list的使用

? ? 🔥個人主頁:guoguoqiang. 🔥專欄:我與C的愛戀 一、list介紹 1.list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器,并且該容器可以前后雙向迭代 2.list的底層是雙向鏈表結構,雙向鏈表中…

華為OCR 騰訊OCR 百度OCR 三家各分秋色 第一當屬華為

當提及華為OCR的應用場景時,這些是常見的使用案例: 金融行業:在銀行和金融機構中,華為OCR技術廣泛用于身份證件識別、銀行卡識別和票據識別。這些功能可以用于客戶身份驗證、快速開戶以及自動化的支付處理。 政府服務&#xff1a…

淺析Estimator、model_fn與EstimatorSpec

參考閱讀:https://zhuanlan.zhihu.com/p/74857888 文章目錄 綜合對比Estimatormodel_fnEstimatorSpec關系總結 Estimator主要功能構造函數參數示例用法小結 model_fnEstimatorSpec字段解釋解釋代碼用途 綜合對比 Estimator、model_fn 和 EstimatorSpec 是 TensorF…

西電811考研、140分專業課及811/821經驗

被擬錄取了,說一說自己考研經驗,本人跟的研夢考研全程班,胖覃學長很負責任,貌似已經直博西電了,但也很負責。 1、通信工程學院分為學碩與專碩,學碩包含信息與通信工程、交通運輸工程、軍隊指揮學&#xff…

Perl語言中的排序藝術:深入探討內置排序函數

Perl是一種功能強大的腳本語言,以其靈活的文本處理能力而聞名。在Perl中,排序是一項常見的任務,無論是對數組元素進行排序,還是對復雜數據結構進行排序,Perl都提供了多種內置的排序函數,以滿足不同的需求。…

深入掌握Symfony與Composer:PHP依賴管理的藝術

引言 Composer是PHP的依賴管理工具,廣泛用于Symfony等現代PHP應用程序中。它允許開發者聲明依賴項,自動處理依賴的安裝和更新,確保應用程序的依賴項得到有效管理。本文將詳細介紹Composer的使用方法,包括基本命令、依賴管理、自動…

Linux環境安裝配置nginx服務流程

Linux環境的Centos、麒麟、統信操作系統安裝配置nginx服務流程操作: 1、官網下載 下載地址 或者通過命令下載 wget http://nginx.org/download/nginx-1.20.2.tar.gz 2、上傳到指定的服務器并解壓 tar -zxvf nginx-1.20.1.tar.gzcd nginx-1.20.1 3、編譯并安裝到…

條件過濾檢索

背景介紹 在大多數業務場景中,單純使用向量進行相似性檢索并無法滿足業務需求,通常需要在滿足特定過濾條件、或者特定的“標簽”的前提下,再進行相似性檢索。 向量檢索服務DashVector支持條件過濾和向量相似性檢索相結合,在精確滿…

數字化供應鏈:背景特點

?背景 1、外部環境 近年來,供應鏈脆弱性凸顯,企業供應鏈壓力難以緩解。 美國媒體針對美國零售聯合會、美國服裝和鞋類協會、美國供應鏈管理專業委員會等主體進行的一項供應鏈調查顯示: 61%的供應鏈經理預計,供應鏈紊亂問題至少…

C++(第一天-----命名空間和引用)

一、C/C的區別 1、與C相比   c語言面向過程,c面向對象。   c能夠對函數進行重載,可使同名的函數功能變得更加強大。   c引入了名字空間,可以使定義的變量名更多。   c可以使用引用傳參,引用傳參比起指針傳參更加快&#…

企業化運維(5)_mysql數據庫

###1.源碼編譯mysql### 對壓縮包進行解壓,并對mysql進行源碼編譯,其中需要下載依賴才能編譯成功。 官網: www.mysql.com解壓并進入目錄 [rootserver1 ~]# tar xf mysql-boost-5.7.40.tar.gz [rootserver1 ~]# cd mysql-5.7.40/安裝依賴性…

初識Java(復習版)

一. 什么是Java Java是一種面向對象的編程語言,和C語言有所不同,C語言是一門面向過程的語言。偏底層實現,比較注重底層的邏輯實現。不能一味的說某一種語言特別好,每一種語言都是在特定的情況下有自己的優勢。 二.Java語言發展史…

昇思25天學習打卡營第2天|yulang

今天主要了解快速入門,主要包含了處理數據集、網絡構建、模型訓練、保存模型和加載模型,這些對于不是算法工程師理解起來可能稍微有一點的難度,學習起來有點枯燥,期待后續實戰部分能完成一些獨立的比較有意思的項目。

鴻蒙項目實戰-月木學途:2.自定義底部導航

效果預覽 Tabs組件簡介 Tabs組件的頁面組成包含兩個部分,分別是TabContent和TabBar。TabContent是內容頁,TabBar是導航頁簽欄,頁面結構如下圖所示,根據不同的導航類型,布局會有區別,可以分為底部導航、頂部…

使用ECharts實現動態數據可視化的最佳實踐

使用ECharts實現動態數據可視化的最佳實踐 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 引言 隨著數據驅動決策的重要性日益增強,動態數據可視…

第二十站:Java未來光譜——量子計算與新興技術的展望

Java作為一門成熟且廣泛使用的編程語言,其在傳統計算領域已經取得了巨大的成功。然而,隨著量子計算等新興技術的出現,Java也在探索其在這些領域的應用潛力。IBM Qiskit是一個開源的量子計算軟件框架,它允許開發者使用多種編程語言…

登錄驗證碼高擴展性設計方案

登錄驗證碼高擴展性建設方案 本文分享了一種登錄驗證碼高擴展性的建設方案,通過工廠模式策略模式,增強了驗證碼服務中驗證碼生成器、驗證碼存儲器、驗證碼圖片生成器的擴展性,實現了服務組件的多樣化,降低了維護成本 登錄驗證碼高…