原题链接:二叉树中的最大路径和
个人解法
思路:
经过某个根的最长路径,我们可以抽象为下列情况的最大值
- 以左子树根为端点的最长路径
- 以右子树根为端点的最长路径
- 以左子树根为端点的最长路径+根结点的值+右子树根为端点的最长路径组成的路径长度
那么我们还需要求以某一个根我端点的最长路径,下列情况的最大值
- 以左子树根为端点的最长路径 + root->val
- 以右子树根为端点的最长路径 + root->val
- root->val
故可以发现,上述就是递归定义,可以直接用递归来做,为了防止重复计算,可以记录以某根为端点的最长路径,如重复直接返回即可
时间复杂度: O ( n ) O(n) O(n)
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
unordered_map<TreeNode *, int> st;
int res = -1010;
int F(TreeNode *root) {
if(root == nullptr) return 0;
if(st.count(root)) return st[root];
int t = max(F(root->left), F(root->right)) + root->val;
t = max(t, root->val);
st[root] = t;
return t;
}
void pre(TreeNode *root) {
if(root == nullptr) return;
if(root->left) res = max(res, F(root->left));
if(root->right) res = max(res, F(root->right));
res = max(res, F(root));
if(root->left && root->right)
res = max(res, F(root->left) + root->val + F(root->right));
pre(root->left);
pre(root->right);
}
int maxPathSum(TreeNode* root) {
st[root] = F(root);
pre(root);
return res;
}
};