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

本文介绍了 LeetCode 上的 124. 二叉树最大路径和问题,详细解释了解题思路及算法实现过程。通过递归计算左右子树的最大贡献值,确定包含当前节点的最大路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值