問題描述
給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
解題報告
以某一子樹的根節點爲研究對象,如果最大路徑經過該子樹,則必定 經過該子樹的根節點以及該子樹 左右子樹 中的某一子樹。
實現時:
- 設置全局變量
val
,它記錄了整棵樹的最大路徑和。 - 遞歸搜索每棵子樹的根節點,其返回經過該子樹根節點的的最大路徑和【該路徑只經過該子樹的某一子樹】。
- 在遞歸的過程中,更新
val
的值【在本身的值以及經過遞歸子樹的根節點(是否包含遞歸子樹
左右子樹的最大路徑和
取決於經過左右子樹的最大路徑和
是否大於0
)這兩者中取最大值】 - 具體參考代碼
實現代碼
class Solution {
public:
int maxPathSum(TreeNode* root, int &val)
{
if (root == nullptr) return 0;
int left = maxPathSum(root->left, val);
int right = maxPathSum(root->right, val);
int lmr = root->val + max(0, left) + max(0, right);
int ret = root->val + max(0, max(left, right));
val = max(val, lmr);
cout<<root->val<<" "<<left<<" "<<right<<" "<<lmr<<" "<<ret<<" "<<val<<endl;
return ret;
}
int maxPathSum(TreeNode* root)
{
int val = INT_MIN;
maxPathSum(root, val);
return val;
}
// 作者:ikaruga
// 鏈接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-ikaruga/
// 來源:力扣(LeetCode)
// 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
};
參考資料
[1] Leetcode 124. 二叉樹的最大路徑和
[2] 題解區:ikaruga