LeetCode總結 樹的求和篇

2021-09-07 13:49:11 字數 1841 閱讀 5907

樹的求和屬於樹的題目中比較常見的,由於能夠有幾種變體,靈活度比較高,也能夠考察到對於樹的資料結構和遞迴的理解。

一般來說這些題目就不用考慮非遞迴的解法了(儘管事實上道理是跟

leetcode總結 -- 樹的遍歷篇

一樣的。僅僅要掌握了應該沒問題哈)。

leetcode中關於樹的求和有下面題目:

path sum

path sum ii

sum root to leaf numbers

binary tree maximum path sum

我們先來看看最常見的題目

path sum。這道題是推斷是否存在從根到葉子的路徑和跟給定sum同樣。樹的題目基本都是用遞迴來解決,主要考慮兩個問題:

1)怎樣把問題分治成子問題給左子樹和右子樹。

這裡就是看看左子樹和右子樹有沒有存在和是sum減去當前結點值得路徑。僅僅要有乙個存在。那麼當前結點就存在路徑。

2)考慮結束條件是什麼。這裡的結束條件乙個是假設當前節點是空的。則返回false。

還有乙個假設是葉子,那麼假設剩餘的sum等於當前葉子的值。則找到滿足條件的路徑,返回true。

想清楚上面兩個問題,那麼實現起來就是一次樹的遍歷,依照剛才的分析用引數或者返回值傳遞須要維護的值。然後依照遞迴條件和結束條件進行返回就可以。演算法的時間複雜度是一次遍歷o(n),空間複雜度是棧的大小o(logn)。

對於path sum ii。事實上思路和

path sum是全然一樣的。僅僅是須要輸出全部路徑,所以須要資料結構來維護路徑,加入兩個引數,乙個用來維護走到當前結點的路徑,乙個用來儲存滿足條件的全部路徑,思路上遞迴條件和結束條件是全然一致的。空間上這裡會依賴於結果的數量了。

sum root to leaf numbers這道題多了兩個變化,乙個是每個結點相當於位上的值。而不是本身有權重。只是事實上沒有太大變化。每一層乘以10加上自己的值就能夠了。

還有乙個變化就是要把全部路徑累加起來,這個事實上就是遞迴條件要進行調整,path sum中是推斷左右子樹有乙個找到滿足要求的路徑就可以,而這裡則是把左右子樹的結果相加返回作為當前節點的累加結果就可以。

變化比較大並且有點難度的是

binary tree maximum path sum,這道題目的路徑要求不再是從根到葉子的路徑,這個題目是把樹全然看成乙個無向圖。然後尋找當中的路徑。想起來就認為比上面那種麻煩很多。只是細緻考慮會發現還是有章可循的,找到乙個根節點最大路徑。無非就是找到左子樹最大路徑,加上自己的值,再加上右子樹的最大路徑(這裡左右子樹的路徑有可能不取,假設小於0的話)。我們要做的事情就是對於每個結點都做一次上面說的這個累加。而左子樹最大路徑和右子樹最大路徑跟

path sum ii思路是比較相似的。儘管不一定要到葉子節點,只是標準也非常easy,有大於0的就取,假設走下去路徑和小於0那麼就不取。

從分治的角度來看,左右子樹的最大路徑就是取自己的值加上max(0,左子樹最大路徑。右子樹最大路徑)。這麼一想也就不用考慮那麼多細節了。

而通過當前節點的最長路徑則是自己的值+max(0,左子樹最大路徑)+max(0,右子樹最大路徑)。

所以整個演算法就是維護這兩個量,乙個是自己加上左或者右子樹最大路徑作為它的父節點考慮的中間量。還有乙個就是自己加上左再加上右作為自己最大路徑。詳細的實現能夠參見binary tree maximum path sum。

這篇總結主要講了leetcode中關於樹的求和的題目。

整體來說,求和路徑有下面三種:(1)根到葉子結點的路徑。(2)父結點沿著子結點往下的路徑。(3)隨意結點到隨意結點(也就是看成無向圖)。

這幾種路徑方式在面試中常常靈活變化,不同的路徑方式處理題目的方法也會略有不同,只是最複雜也就是binary tree maximum path sum這樣的路徑方式。僅僅要考慮清楚仍然是一次遞迴遍歷的問題哈。

樹的求和篇

樹的求和屬於樹的題目中比較常見的,因為可以有幾種變體,靈活度比較高,也可以考察到對於樹的資料結構和遞迴的理解。一般來說這些題目就不用考慮非遞迴的解法了 雖然其實道理是跟 leetcode總結 樹的遍歷篇 一樣的,只要掌握了應該沒問題哈 leetcode中關於樹的求和有以下題目 path sum pa...

LeetCode總結 樹的性質篇

樹的性質判斷是樹的資料結構比較基本的操作,一般考到都屬於非常簡單的題目,也就是第一道入門題,面試中最好不能有問題,力求一遍寫對,不要給面試官任何挑刺機會。leetcode中關於樹的性質有以下題目 maximum depth of binary tree minimum depth of binary...

LeetCode總結 矩陣篇

矩陣 一般是二維陣列 操作的題目在面試中考察基礎coding的時候比較常見,一般來說不帶有太多演算法思想,純粹就是二維陣列下標的操作。雖然比較簡單,不過還是比較能體現基本的實現能力。leetcode中關於矩陣操作的題目有以下幾個 spiral matrix spiral matrix ii rota...