class Solution {
public:
int maxPathSum(TreeNode *root) {
int s, m;
dfs(root, s, m);
return (m > s) ? m : s;
}
void dfs(TreeNode* root, int& sole, int& misc) {
if (root == NULL) {
sole = INT_MIN;
misc = INT_MIN;
return;
}
int ls, lm, rs, rm, ms, mm;
dfs(root->left, ls, lm);
dfs(root->right, rs, rm);
ms = (ls > rs) ? ls : rs;
mm = (lm > rm) ? lm : rm;
sole = root->val + (ms < 0 ? 0 : ms);
int m = ((ls < 0 ? 0 : ls) + (rs < 0 ? 0 : rs) + root->val);
misc = mm > m ? mm : m;
}
};
dfs深度优先遍历计算路径和,它分别计算经过该节点,且另一个端点在左或右子树中的最大路径和(得到的这两个路径是不会跨越该节点的,用sole表示),那么对于那些端点不包括当前节点,分布在左/右子树中的(该种类的)最大路径和用misc表示。则以当前节点为根的子树的最大路径和,可能是其某个子树中的misc类路径,也可能是左sole+右sole+当前节形成的路径,通过比较他们两者的值我们可以得到该子树的最大路径和。同样的对于整棵树也是如此。
可以看到misc变量只负责存储dfs搜索过程中的最大路径和,因此也可以把包含左右子树中路径的最大路径和存到一个全局/类变量中,并初始化为最小值。
class Solution {
private:
int max_path;
public:
int maxPathSum(TreeNode *root) {
max_path = INT_MIN;
dfs(root);
return max_path;
}
int dfs(TreeNode* root) {
if (root == NULL) return 0;
int ls = dfs(root->left);
int rs = dfs(root->right);
int ms = (ls > rs) ? ls : rs;
int sole = root->val + (ms < 0 ? 0 : ms);
int m = ((ls < 0 ? 0 : ls) + (rs < 0 ? 0 : rs) + root->val);
if (m > max_path) max_path = m;
return sole;
}
};
参考:
zhuli题解 http://www.cnblogs.com/zhuli19901106/p/3547387.html
第二轮:
Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1
/
2 3
Return 6.
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: int maxsum; public: int maxPathSum(TreeNode *root) { maxsum = INT_MIN; dfs(root); return maxsum; } int dfs(TreeNode* root) { if (root == NULL) return 0; int val = root->val; int mvl = dfs(root->left); int mvr = dfs(root->right); int s = val; if (mvl > 0) s+=mvl; if (mvr > 0) s+=mvr; if (s > maxsum) { maxsum = s; } int mv = max(mvl, mvr); return val + (mv > 0 ? mv : 0); } };
再一次,这回可以自己想出来了,记忆的关系吧:
/** * 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 maxsum; public: int maxPathSum(TreeNode* root) { maxsum = INT_MIN; dfs(root); return maxsum; } int dfs(TreeNode* root) { if (root == NULL) { return 0; } int ld = dfs(root->left); int rd = dfs(root->right); int csum = root->val; if (ld > 0) { csum += ld; } if (rd > 0) { csum += rd; } maxsum = max(maxsum, csum); return (max(ld, rd) > 0 ? max(ld, rd) : 0) + root->val; } };