在当前节点 cur 取得左右子的最大路径和,即 l = dfs(cur->left), r = dfs(cur->right)。
那么在当前节点可以判断得到的最大路径和为 cur->val、cur->val + l、 cur->val + r 和 cur->val + l + r 其中的一种,即 ans = max(ans, cur->val, cur->val + l, cur->val + r, cur->val + l + r)。
之所以出现四种情况,是因为 l 和 r 可能出现负值。
这里就可以用一个方法来简化答案,当 l 或 r 是负数时,将其置为 0 视为不拼接路径,即 l = max(0, dfs(cur->left)), r = max(0, dfs(cur->right)),此时更新 ans 的代码变得更简洁了,即 ans = max(ans, cur->val + l + r)。
最后递归函数返回的是可以传递给父节点的路径和,传递给父节点就意味着路径向上延申,因此只可能是 cur->val + l 和 cur->val + r 的一种,取两者的最大值即可。
代码实现:
classSolution{private:int ans = INT_MIN;intdfs(TreeNode* root){if(!root)return0;int l =max(0,dfs(root->left));int r =max(0,dfs(root->right));
ans =max(ans, l + r + root->val);returnmax(l + root->val, r + root->val);}public:intmaxPathSum(TreeNode* root){dfs(root);return ans;}};