leetcode 124. 二叉树中的最大路径和
题目详情
题目链接
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
- 示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6- 示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
我的代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
int res;
public:
int getMaxPath(TreeNode *pNode) {
if (!pNode) {
return 0;
}
int leftVal = max(getMaxPath(pNode->left), 0);
int rightVal = max(getMaxPath(pNode->right), 0);
res = max(res, pNode->val + leftVal + rightVal);
return pNode->val + max(leftVal, rightVal);
}
int maxPathSum(TreeNode* root) {
res = INT_MIN;
getMaxPath(root);
return res;
}
};
我的成绩
执行结果:通过
执行用时:48 ms, 在所有 C++ 提交中击败了54.29%的用户
内存消耗:28.6 MB, 在所有 C++ 提交中击败了7.69%的用户
一些想法
参考官方解答
执行用时为 12 ms 的范例
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxPathSum(TreeNode* root) {
if (root == nullptr)
return 0;
int maxSum = INT_MIN;
maxPathSum(root,maxSum);
return maxSum;
}
//maxPathSum函数表示计算自底向上到root结点的树的最大值(自底向上到某结点只有唯一的一条路径)
int maxPathSum(TreeNode* root,int& ans)
{
if (root == nullptr)
return 0;
int maxLeft = maxPathSum(root->left, ans);//计算root左子树的最大值
int maxRight = maxPathSum(root->right, ans);//计算root右子树的最大值
//更新最大值ans
ans = max(ans, root->val);
//ans = max(ans, maxLeft);//ans表示必须经过root结点
//ans = max(ans, maxRight);
ans = max(ans, root->val + maxLeft);
ans = max(ans, root->val + maxRight);
ans = max(ans, root->val + maxLeft + maxRight);
//返回自底向上到root结点的树的最大值
if (maxLeft <= 0 && maxRight <= 0) return root->val;
return (maxLeft >= maxRight)?(maxLeft + root->val):(maxRight + root->val);
}
};
思考
和官方解答类似。