代码不是我想的,这里只是做出解释
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @return int整型 */ int maxSum = INT_MIN; int sumPath(TreeNode*root){ if(!root) return 0; auto l = max(0, sumPath(root->left)); auto r = max(0, sumPath(root->right)); maxSum = max(maxSum, l + r + root->val); return max(l, r) + root->val; } int maxPathSum(TreeNode* root) { // write code here sumPath(root); return maxSum; } };
这个算法的想法也很简单:
- 计算左子树的最大路径和
- 计算右子树的最大路径和
- 更新树的最大路径和
- 返回此树的最大路径和
巧妙之处在于使用 0 过滤掉了结果为负数的最大路径和
另外将 maxSum 的更新是每次迭代都会进行了,也就是说在每棵子树上都会进行,这样如果出现子树比较大而根节点为负值的情况时,就不会更新 maxSum
说是最大路径和,不如叫做节点的最大和(至少一个节点)