积少成多

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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.

=============

题目:树中联通路径中,路径元素和最大值?

路径利用父子关系相连,不必经过根节点root

路径可以从任意节点开始,到任意节点.

=====

思路:

这道题的解法,来自网络leetcode150题集合,

利用dfs遍历树的方式,传递每个树父子节点间的路径大小;

利用一个全局遍历来时记住max_sum来记录已经找到的最大的路径值,

最难理解的是怎么在 dfs遍历树的过程,传递路径信息?

-----

借用"最大连续子序列和"问题的思路,array只有一个方向,

但是Tree有左右两个方向,我们需要比较两个方向上的值.

先算出左右子树的结果L和R.

  如果L>0,那么对后序结果是有利的,后序中加上L,(不是向max_sum中,而是向如节点中)

  如果R>0,那么对后序结果是有利的,加上R

---

==========

代码如下:

/**
 * 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 {
public:
    ///
    int help_maxPathSum(int &max_sum,TreeNode *root){
        if(root==nullptr) return 0;
        int l = help_maxPathSum(max_sum,root->left);
        int r = help_maxPathSum(max_sum,root->right);
        int sum = root->val;
        if(l>0) sum += l;
        if(r>0) sum += r;
        max_sum = max(max_sum,sum);
        return max(r,l)>0? max(r,l)+root->val:root->val;//只能向上传递 左子树或者  右子树的有利值
    }
    int maxPathSum(TreeNode* root) {
        int max_sum = INT_MIN;
        help_maxPathSum(max_sum,root);
        return max_sum;
    }
};

 

posted on 2016-06-26 20:37  x7b5g  阅读(194)  评论(0编辑  收藏  举报