二叉樹路徑和問題

2021-10-07 05:46:31 字數 1559 閱讀 2967

問題一:二叉樹中最大路徑和(leetcode124)

問題描述:

給定乙個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。

大體思路:

其最大路徑和有以下四種可能:

1) 由當前結點的左子樹結點到右子樹結點

2) 由當前結點到其左子樹某一節點

3) 由當前結點到其右子樹某一節點

4) 由當前結點本身

分析完可能性發現不能簡單的返回當前結點的最大路徑和,對於子節點是情況一而言,父節點拿到子結點的路徑和沒有一點作用。因此我們使用一全域性變數儲存最大路徑和,遍歷時返回以該節點出發的最大路徑(有點類似二叉樹的深度)由於是任意結點出發到任意節點,因此若當前結點的最大路徑小於0時返回值應該為0(表示可以不往下走了)。

實現**如下:

class solution 

public int process(treenode root)

int left = process(root.left);

int right = process(root.right);

ans = math.max(ans, root.val + left + right);

return math.max(0, math.max(root.val + right, root.val + left));

}}

問題二:最長同值路徑(leetcode687)

問題描述:

給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。

注意:兩個節點之間的路徑長度由它們之間的邊數表示。

大體思路:

由於都是路徑和問題,與問題一的四種可能性相同。

使用一全域性變數儲存最大的同值路徑和。

遍歷時返回以當前結點出發的最大同值路徑和length。

當前節點拿到左右孩子的length時,會判斷其左右孩子是否與當前結點值相同,若相同其的length為左右孩子中長度最大的加1;經過當前結點的最大路徑長度為左右孩子長度 + 1之和。

實現**如下:

class solution 

public int process(treenode root)

int sum = 0;// 經過當前結點的最大同值路徑和

int length = 0; // 從當前結點出發的最大同值路徑和

int left = process(root.left);

int right = process(root.right);

if(root.left != null && root.val == root.left.val)

if(root.right != null && root.val == root.right.val)

ans = math.max(ans, sum);

return length;

}}

二叉樹路徑和問題

今天回顧了一下二叉樹給定sum的問題,邏輯還是有問題,本以為對的,寫了如下的 bool haspathsum treenode root,int sum if path sum return true p s.top s.pop if p left null path p left val p p ...

二叉樹路徑和

二叉樹中和為某一值的路徑 輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。示例 給定如下二叉樹,以及目標和sum 22,5 4 8 11 13 4 7 2 5 1返回 5,4,11,2 5,8,4,5 public l...

二叉樹路徑搜尋問題

1 求任意二叉樹中的所有路徑 細想一下,這其實是乙個dfs問題。有乙個helper函式,用來向list中新增string。這裡為什麼要用靜態的string而不是動態的stringbuilder?另乙個問題是,要動態地新增內容給list,從思路上講應該是回溯法。回溯用動態子結構比如list的話,就需要...