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梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~