题目:二叉树中的最大路径和
- 作为贡献值(向上传递):此时,它只能选择【当前节点值】与【当前节点值 + 左子树贡献值 + 右子树贡献值】中的更大者
- 作为拐点(更新全局最大路径和): 以当前节点为根的局部最大路径和为——
当前节点值 + 左子树最大贡献 + 右子树最大贡献,如果之前记录过的最大和小于这个临时的和,就将其覆写
1class Solution
2{
3public:
4 int maxPathSum(TreeNode* root)
5 {
6 pathGain(root);
7 return maxSum;
8 }
9private :
10 int maxSum = INT_MIN;
11 int pathGain(TreeNode* curr)
12 {
13 if(curr == nullptr) return 0;
14
15 // 计算左右子树的最大贡献(不小于零)
16 int left_gain = std::max(pathGain(curr->left), 0);
17 int right_gain = std::max(pathGain(curr->right), 0);
18
19 // 以当前节点为根的最大路径之和
20 int curr_sum = curr->val + left_gain + right_gain;
21
22 // 更新最大值
23 maxSum = std::max(maxSum, curr_sum);
24
25 // 向上传递
26 return curr->val + std::max(left_gain, right_gain);
27 }
28};
原文:hard