题目:
Given a binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path does not need to go through the root.
For example:
Given the below binary tree,
1
/ \
2 3
Return 6.
这个题在poj里面有类似的。
就是求树的直径。
方法就是两遍dfs,第一遍找出从每个节点向下的最长路径,第二遍找出每个节点向下的第二场路径。然后max(每个节点的最长路径+第二长路径-节点权值)即为树的直径。
ps:leetcode这种指针真的很烦哎。。
class Solution {
public:
int ans;
map<TreeNode*, int> malen;
map<TreeNode*, TreeNode*> manode;
int maxPathSum(TreeNode* root) {
ans = -9999999;
dfs1(root);
dfs2(root);
return ans;
}
int dfs1(TreeNode* x) {
if (x == NULL) return 0;
int mx = x->val;
TreeNode* mn = x;
if (x->val + dfs1(x->left) > mx) {
mx = x->val + malen[x->left];
mn = x->left;
}
if (x->val + dfs1(x->right) > mx) {
mx = x->val + malen[x->right];
mn = x->right;
}
malen[x] = mx;
manode[x] = mn;
return mx;
}
void dfs2(TreeNode* x) {
if (x == NULL) return;
int aa = x->val;
if (x->left != NULL && x->left != manode[x])
aa = max(aa, x->val + malen[x->left]);
if (x->right != NULL && x->right != manode[x])
aa = max(aa, x->val + malen[x->right]);
ans = max(ans, malen[x] + aa - x->val);
dfs2(x->left);
dfs2(x->right);
}
};