码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Binary Tree Maximum Path Sum 求二叉树的最大路径和

时间:2015-02-08 16:46:31      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

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.

 

这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,我当然是又不会了,于是上网看看大神们的解法,看了很多人的都没太看明白,最后发现了网友Yu‘s Coding Garden的博客,感觉讲解还比较清楚,像这种类似数的遍历的题,一般来说都需要用DFS来求解,我们先来看一个简单的例子:

    4
   / \
 11 13
 / \
7  2

对于一条路径来说,可以分为两种情况,一是当顶节点是当前点,另一种是定节点是父节点。例如,对于节点11来说,

1. 当顶节点是当前节点,对于节点11,路径为 6->11->2

2. 当顶节点是父节点4时,对于节点11,路径为 7->11->4->13

对于DFS来说,其递归过程中必定会对某节点的子节点调用,那么其返回值应该适用于上面第二种情况,但是最终结果肯定是第一种情况,那么如果保存并更新最终结果呢,我们可以将其放在参数中传递。那么对于任意一个节点n来说,

DFS(n) = max(DFS(n->left) + n->val, DFS(n->right) + n->val, n->val);

top(n) = max(DFS(n), DFS(n->left) + DFS(n->right) + n->val, n->val);

res = max(res, top(n));

理解了上述三个公式,这道题就基本理解了,具体的再看看代码吧:

 

class Solution {
public:
    int maxPathSum(TreeNode *root) {
        int res = root->val;
        maxPathSumDFS(root, res);
        return res;
    }
    int maxPathSumDFS(TreeNode *root, int &res) {
        if (!root) return 0;
        int left = maxPathSumDFS(root->left, res);
        int right = maxPathSumDFS(root->right, res);
        int top = root->val + (left > 0 ? left : 0) + (right > 0 ? right : 0);
        res = max(res, top);
        return max(left, right) > 0 ? max(left, right) + root->val : root->val; 
    }
};

 

[LeetCode] Binary Tree Maximum Path Sum 求二叉树的最大路径和

标签:

原文地址:http://www.cnblogs.com/grandyang/p/4280120.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!