您的位置:首页 > 其它

LeetCode: Binary Tree Maximum Path Sum [124]

2014-06-22 18:29 591 查看

【题目】

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
.

【题意】

给定一棵二叉树,找出其中路径和最大的路径,然会返回最大路径和。

本题中的路径不是从根节点到叶子节点这样的传统的路径,而是指的二叉树中任意两个节点之间的联通路径。

【思路】

最直观的方法是找出任意两点之间的路径,然后选择和最大的路径。这种最笨的方法单单找两个节点之间的路径就要分4步走:

1. 找到根到节点A的路径 O(logn)

2. 找到根到节点B的路径 O(logn)

3. 找出AB节点的最近公共祖先 O(logn)

4. 计算途经最近公共祖先的路径和

则搜索两两节点之间的路径的复杂就是O(n^2 logn), 显然是不可能接受的

为此,我们换个角度来看。根据上面的分析,要找两个节点A,B之间的路径,我们需要先找两个节点的最近公共祖先R。那么实际上,只要A和B分别位于R的左右两棵子树上,两点之间的路径都需要经过节点R。那么针对根为R的这棵子树,我们可以计算这棵子树上经过R的最大路径。而二叉树上每个节点都都可视为一棵子树的根,所以我们的求解目标变为:计算出每个节点上以此节点为转折点的最大路径。

那么这个最大路径怎么求呢?

我们假设要计算以R为转折点的最短路径,A和B分别是R的左孩子和右孩子,经过A和B的最大路径已知,如下:

path_left(A), path_right(A)分别表示以A为转折点的最小路径在A的左右子树上的两段,则以A为转折点的最小路径即为path_left(A)->A->path_right(A)

path_left(B), path_right(B)分别表示以B为转折点的最小路径在B的左右子树上的两段,则以B为转折点的最小路径即为path_left(B)->B->path_right(B)

那么经过R的最短路径就可以表示为:max(path_left(A), path_right(B)) -> A -> R -> B -> max(path_left(B), path_right(B))

所以,本题其实是一道典型的DP问题,上式即为迭代公式。



【代码】

/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:

int maxPath(int& maxSum, TreeNode *root){
if(root==NULL)return 0;

//计算来自左子树的最大路径和
int maxLeft=maxPath(maxSum, root->left);
//计算来自右子树的最大路径和
int maxRight=maxPath(maxSum, root->right);
//计算以当前节点为转折的最大路径和
int curMaxSum=root->val;
if(maxLeft>0)curMaxSum+=maxLeft;    //如果从左右孩子过来的最大和是负值,则连接到当前节点,负值会使合并后的路径和更小,因此只在路径和为正的时候再连接到当前节点,具体表现为路径和相加。
if(maxRight>0)curMaxSum+=maxRight;
//更新结果
if(curMaxSum>maxSum)maxSum=curMaxSum;

//同样需要考虑maxLeft和maxRight的正负
int largerSum = max(maxLeft, maxRight);
if(largerSum>0)return root->val+largerSum;
else return root->val;
}

int maxPathSum(TreeNode *root) {
if(root==NULL)return 0;
int max=INT_MIN;
maxPath(max, root);
return max;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: