问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【LeetCode】二叉树中的最大路径和

创作时间:
作者:
@小白创作中心

【LeetCode】二叉树中的最大路径和

引用
CSDN
1.
https://blog.csdn.net/qq_41840843/article/details/144993774

【LeetCode】二叉树中的最大路径和

💐The Begin💐点点关注,收藏不迷路💐

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1:

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
树中节点数目范围是 [1, 3 * 104]
-1000 <= Node.val <= 1000

  
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// 定义二叉树节点结构体
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};
// 辅助函数:计算最大路径和
int maxPathSumHelper(struct TreeNode* root, int* maxSum) {
    if (root == NULL) {
        return 0;
    }
    // 递归计算左子树的最大单边路径和
    int left = maxPathSumHelper(root->left, maxSum); 
    // 递归计算右子树的最大单边路径和
    int right = maxPathSumHelper(root->right, maxSum); 
    // 计算以当前节点为根的最大单边路径和(包含当前节点)
    int curMax = (left > 0? left : 0) + (right > 0? right : 0) + root->val; 
    // 更新全局最大路径和
    if (curMax > *maxSum) { 
        *maxSum = curMax; 
    }
    // 返回以当前节点为根的最大单边路径和(只能选择左子树或右子树)
    return root->val + (left > right? (left > 0? left : 0) : (right > 0? right : 0)); 
}
// 计算二叉树的最大路径和
int maxPathSum(struct TreeNode* root) {
    int maxSum = INT_MIN; 
    maxPathSumHelper(root, &maxSum); 
    return maxSum; 
}
  

💐The End💐点点关注,收藏不迷路💐

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号