Binary Tree Maximum Path Sum

来源:互联网 发布:胜科金仕达数据系统 编辑:程序博客网 时间:2024/05/17 05:56

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.

好吧,这种题目。。。单独的return max(left,right)已经hold不住了。。。

想了好多办法但是一直都WA、、、目测没啥简单的方法,只能去遍历树,维护一个值ma记录当前已经记录下的最大的Path Sum,然后每遍历到一个节点,都去更新这个值。

当遍历到某个node时,从根到当前的node的总和是sum。分别遍历左子树和右子树,然后用sum,left,right,left-sum,right-sum,left+right-2*sum+node->val来更新最大值。

其中,sum代表从根到当前节点的值,left代表从根到node->left的最大值,right代表从根到node->right的最大值,left-sum代表从left开始的最大值,right-sum代表从right开始的最大值,left+right-2*sum+node->val代表选当前node为根,即,整棵树的最大path sum在以node为根的这颗子树中。

view的返回值就是代表从root到当前node能获取到的最大的path sum。


/** * 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 ma=-10000;    int maxPathSum(TreeNode *root) {        view(root,0);        return ma;    }        int view(TreeNode* node,int sum){        if(node==NULL)            return sum;        sum = sum+node->val;        int left = view(node->left,sum);        int right = view(node->right,sum);        ma = max(ma,max(left,right));        if(node->left!=NULL)            ma = max(ma,left-sum);        if(node->right!=NULL)            ma = max(ma,right-sum);        ma = max(ma,left+right-2*sum+node->val) ;        ma = max(ma,sum);        return max(max(left,right),sum);    }    };



0 0