二叉树从一个结点到另一个结点的最大路径--可能不包括根节点

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


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80260712
今日推荐