本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

LeetCode:Binary Tree Maximum Path Sum

题目如下: 二叉树的最大路径和(题目链接

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.

分析:设f(p) 是以节点p作为路径端点的最大路径和,例如下面的树

f(2) = 2+5=7, f(3) = 3+6=9, f(1) = f(3)+1=10

即f(p) = max(p->val ,  p->val+f(p->left),  p->val+f(p->right)), 特别的当p=NULL 时,f(p) = 0;                                                                                                  本文地址

有以上可知经过p节点的路径的最大和maxsum(p) = max(f(p),  f(p->left)+f(p->right)+p->val), 即取p为端点和p为中间节点的路径的较大值

因此可以通过树的后序遍历求得每个节点的maxsum,选取最大的即为最终结果,代码如下:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int maxPathSum(TreeNode *root) {
13         // IMPORTANT: Please reset any member data you declared, as
14         // the same Solution instance will be reused for each test case.
15         if(root == NULL)return 0;
16         int res = INT_MIN;
17         postorderTrav(root, res);
18         return res;
19     }
20     int postorderTrav(TreeNode *root, int& res)
21     {//返回值:root作为端点的path的最大值
22         int left = 0, right = 0; 
23         if(root->left)left = postorderTrav(root->left, res);
24         if(root->right)right = postorderTrav(root->right, res);
25         int res_this = max(max(left+root->val, right+root->val), root->val);
26         int tmp = max(res_this, left + right + root->val);
27         if(tmp > res)
28             res = tmp;
29         return res_this;
30     }
31 };

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3435366.html

posted @ 2013-11-21 13:15  tenos  阅读(804)  评论(0编辑  收藏  举报

本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

公益页面-寻找遗失儿童