leetcode124. Binary Tree Maximum Path Sum
一、问题描述
给定一个非空的二叉树,找到最大路径和。
对于这个问题,路径被定义为从父节点连接到树中任何节点的任意节点的任意序列。 该路径必须至少包含一个节点,并且不需要经过根节点。
【举例】
输入1: [1,2,3]
1
/ \
2 3
输出: 6
输入2:[-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
先算出左右子树的结果L 和R,如果L 大于0,那么对后续结果是有利的,加上L,如果R 大于0,对后续结果也是有利的,继续加上R。
三、算法实现/*************************************************
Author:tmw
date:2018-5-9
**************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define max( a,b ) (a>b?a:b)
typedef struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
int max_sum = INT_MIN;
int dfs(TreeNode* root)
{
if( root == NULL ) return 0;
/**先算出当前左右子树的结果left_sum和right_sum**/
int left_sum = dfs(root->left);
int right_sum = dfs(root->right);
/**当前结果**/
int sum = root->val;
/**以下三句为了记录当前三角线的最大sum**/
if( left_sum > 0 ) sum += left_sum;/**如果left_sum>0,说明对当前结果有利,加入**/
if( right_sum > 0 ) sum += right_sum;/**如果right_sum>0,说明对当前结果有利,加入**/
max_sum = max( sum, max_sum );/**由于不清楚根节点是不是会加入最大路径中,因此先记录当前三角线的最大sum**/
/**根节点加入的情况:返回当前左右支最大的那条路径**/
return max(left_sum, right_sum)>0 ? max(left_sum,right_sum)+root->val : root->val;
}
int maxPathSum(TreeNode* root)
{
if( root == NULL ) return 0;
max_sum = INT_MIN; /**每次结果更新max_sum**/
dfs(root);
return max_sum;
}
四、执行结果
accept梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~