leetcode124. 二叉树中的最大路径和

 

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不需要经过根节点。

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6

示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

解题思路:

根据题意可以分成两种情况:

  1. 只考虑当前节点和左右子树,累计的和不往上一个节点上传,这时路径大概成"^"字型
  2. 考虑上面一个节点,那么这时候左右子树只能考虑一个,或者两个子树均不考虑,路径大概成"/"或者"\"字型

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //根节点为负数怎么处理
    //考虑左右子树,根节点与上面节点切断;考虑上面节点,左右子树只能取一个或者两个均不取
    int maxPathSum(TreeNode* root) {
        if(!root) return 0;
        
        int ans=INT_MIN;
        solve(root,ans);
        return ans;
    }
    
    int solve(TreeNode *root,int &ans){
        if(!root) return 0;
        int cur=root->val;
        
        int left=solve(root->left,ans);
        int right=solve(root->right,ans);
        
        if(left>0) cur+=left;
        if(right>0) cur+=right;
        
        ans=max(ans,cur);//考虑左右子树
        // return cur;
        return max(root->val,max(root->val+left,root->val+right)); //考虑上面节点
    }
};

 

 

posted @ 2018-05-31 09:37  xzhws  阅读(27)  评论(0编辑  收藏  举报