Leetcode 二叉樹簡單路徑最大和問題

2021-06-22 13:44:52 字數 2275 閱讀 8595

問題一:二叉樹任意兩個葉子間簡單路徑最大和

示例:-100

2   100

10   20

思路:這個問題適用於遞迴思路。

首先,將問題簡單化:假設包含最大和summax的簡單路徑經過結點a,結點a必然存在左右子樹,設f(node*)函式可以求出子樹葉子到子樹樹根最大和路徑,則有summax=a.val+f(a.leftchild)+f(a.rightchild),此時,遍歷樹中擁有左右子樹的節點,並提取最大值即可。

再假設fmax(node*)可以求出以該結點引數為根的樹/子樹的任意兩個葉子間簡單路徑最大和,則可以分為三種情況:1.最大和路徑經過根結點;2.最大和路徑在左子樹中;3.最大和路徑在右子樹中。比較三者取出最大值作為fmax函式的返回值。

為了簡化**,使用之前所寫的建立二叉樹的函式

struct tree_node;

struct tree_node;

typedef struct tree_node treenode;

void pre_create_tree(treenode **t)

else

else }}

void pre_visit_tree(treenode *t)

else

}

這裡為了方便,假設輸入資料不等於-1000,那麼求葉子到樹根最大值函式f(node*)如下所示:

int maxpath(treenode *t)
求解任意葉子簡單路徑最大和fmax函式實現:

int maxs(treenode *t)

if(t->lc!=null&&t->rc!=null)

templc = maxs(t->lc);

temprc = maxs(t->rc);

if(temproot>templc)

if(temproot>temprc)

return temproot;

else

return temprc;

else

if(templc>temprc)

return templc;

else

return temprc;

}

測試輸入:-100 2 10 -1000 -1000 20 -1000 -1000 100

呼叫maxs函式將返回32。

問題二:我們將問題稍微變化一下,改為求任意結點間簡單路徑最大和,允許路徑只有乙個結點。

這時候遞迴是否有效?答案是肯定的。

看圖:a

b       c

bl   br cl   cr

把樹或者子樹看成上圖的模式,假設我們已經實現乙個函式f(node* param),根結點為引數結點param的子樹,經過param結點的最大路徑和(這裡並不需要到達葉子)。

由上圖我們對乙個結點分3種情況考慮:

1.最大和路徑經過結點a,即有四種可能值:a.val,a.val+f(b),a.val+f(c),a.val+f(b)+f(c);

2.最大和路徑不經過結點a,且在結點a的左子樹內並經過結點b,值為f(b);

3.最大和路徑不經過結點a,且在結點a的右子樹內並經過結點c,值為f(c)。(情況2,3是不是不需要呢?好像是的,先記著後面來改)

在這六種可能值中,取其最大值作為計算經過結點a的最大值的「可能路徑」,然後遍歷樹中結點即可得到最大數值。

int maxpath2(treenode *t)

else if(templc>temprc)

return t->data+templc;

else

return t->data+temprc;

}int maxs2(treenode *t)

templc = maxs2(t->lc);

temprc = maxs2(t->rc);

if(temproot>templc&&temproot>temprc)

return temproot;

else if(templc>temprc)

return templc;

else

return temprc;

}

那麼我們試試以下面的二叉樹為例

-100

2   100

10   -20

輸入為-100 2 10 -1000 -1000 -20 -1000 -1000 100 -1000 -1000

呼叫maxs2結果就應該為100了(不是12)。

Leetcode 二叉樹路徑

給定乙個二叉樹和乙個值sum,判斷是否有從根節點到葉子節點的節點值之和等於sum的路徑,例如 給出如下的二叉樹,sum 22,5 4 8 11 13 4 7 2 5 1返回true,因為存在一條路徑5 4 11 2的節點值之和為22 bool haspathsum treenode root,int...

LeetCode二叉樹路徑和

給定乙個二叉樹,它的每個結點都存放著乙個整數值。找出路徑和等於給定數值的路徑總數。路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的 只能從父節點到子節點 二叉樹不超過1000個節點,且節點數值範圍是 1000000,1000000 的整數。示例 root 10,5,3,3,2...

LeetCode之映象二叉樹(簡單 二叉樹)

問題描述 給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。遞迴 definit...