問題一:二叉樹任意兩個葉子間簡單路徑最大和
示例:-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...