这个题在元旦之前看过一会,那时候没思路,今天写着写着突然就有思路了,代码的效率蛮高的。
题目简介:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
题解
这道题思路在于(求根节点到左子树的最大值+根节点到右子树的最大值+根节点的值)所以要比较四个值:
1、叶子节点的值。
2、子树(树中的树shu)的根节点值。
3、子树的根节点与单边(即二叉树的其中一边)叶子节点的值合。
4、子树的根节点与双边叶子节点的值合
所以我们就要求以以上的值以及比较,并且从子树中返回的值应该是子树的值与单边中较大的值。
代码:
/**
* 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 fuckflag;
int maxPathSum(TreeNode* root) {
fuckflag=-INT_MAX;
op(root);
if(fuckflag==-INT_MAX)
return 0;
return fuckflag;
}
int op(TreeNode*root){
if(root==NULL)
return 0;
//与叶子节点比较
if(root->left==NULL&&root->right==NULL){
fuckflag=fuckflag<root->val?root->val:fuckflag;
return root->val;
}
int l=op(root->left);
int r=op(root->right);
//与双边值的合比较
int fuckval=root->val+l+r;
fuckflag=fuckflag<fuckval?fuckval:fuckflag;
fuckval=l<r?(r+root->val):(l+root->val);
//与根节点or单边的合的值比较
fuckval=root->val<fuckval?fuckval:root->val;
fuckflag=fuckflag<fuckval?fuckval:fuckflag;
return fuckval;
}
};