問題一:二叉樹中最大路徑和(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的話,就需要...