LeetCode 算法:二叉树中的最大路径和 c++

原题链接🔗二叉树中的最大路径和
难度:困难⭐️⭐️⭐️

题目

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 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

题解

  1. 解题思路

LeetCode 上的 "二叉树中的最大路径和" 问题是一个关于二叉树的算法题,要求找出二叉树中任意节点组成的路径的最大和。这个问题的难度在于路径可以是任意的,不一定是从根到叶子的路径。

解题思路通常包括以下几个步骤:

  • 理解问题:首先,要清楚地理解问题的要求,即找出二叉树中任意节点组成的路径的最大和。

  • 递归遍历:由于问题涉及到路径,递归是解决二叉树问题的一种常见方法。我们需要递归遍历二叉树的每个节点。

  • 路径和的计算:在递归过程中,我们需要计算从当前节点到任何叶子节点的路径和。这包括当前节点的值,以及左右子树中较小的路径和,因为如果一个子树的路径和为负,那么它将不会对总和产生贡献。

  • 更新全局最大值:在递归的过程中,我们需要更新一个全局变量,以记录到目前为止找到的最大路径和。

  • 考虑边界情况:在递归的过程中,需要考虑叶子节点的情况,因为叶子节点没有子节点,其路径和就是其自身的值。

  • 回溯:在递归回溯的过程中,需要将之前计算的路径和传递回父节点,以便计算包含当前节点的路径和。

  • 优化:在计算路径和时,可以只考虑正的路径和,因为负的路径和不会对最大值有贡献。

  1. c++ demo
cpp 复制代码
#include <iostream>
#include <algorithm> // 用于max函数

using namespace std;

// 定义二叉树的节点结构
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
private:
    int maxSum; // 用于记录最大路径和

    // 辅助函数,用于递归计算以node为根的子树的最大贡献
    int max_gain(TreeNode* node) {
        if (!node) return 0; // 空节点贡献为0

        int left_gain = max(max_gain(node->left), 0); // 左子树的最大贡献,负数贡献为0
        int right_gain = max(max_gain(node->right), 0); // 右子树的最大贡献

        // 更新当前节点的最大路径和
        int current_max_path_sum = node->val + left_gain + right_gain;
        maxSum = max(maxSum, current_max_path_sum);

        // 返回当前节点对父节点的最大贡献
        return node->val + max(left_gain, right_gain);
    }

public:
    int maxPathSum(TreeNode* root) {
        maxSum = INT_MIN; // 初始化为最小整数
        max_gain(root); // 计算以root为根的子树的最大贡献
        return maxSum; // 返回最大路径和
    }
};

// 测试代码
int main() {
    // 构建示例二叉树
    //       1
    //      / \
    //     2   3
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);

    // 创建Solution对象并计算最大路径和
    Solution solution;
    cout << "Maximum Path Sum: " << solution.maxPathSum(root) << endl;

    // 清理内存
    delete root->left;
    delete root->right;
    delete root;

    return 0;
}
  • 输出结果:

Maximum Path Sum: 6

  1. 代码仓库地址max_gain
相关推荐
尤超宇1 分钟前
YOLOv3 目标检测算法核心技术
算法·yolo·目标检测
云泽80818 分钟前
C/C++内存管理详解:从基础原理到自定义内存池原理
java·c语言·c++
cyclel23 分钟前
散列表的小想法
算法
Code小翊27 分钟前
堆的基础操作,C语言示例
java·数据结构·算法
余俊晖27 分钟前
如何让多模态大模型学会“自动思考”-R-4B训练框架核心设计与训练方法
人工智能·算法·机器学习
Emilia486.34 分钟前
【Leetcode&nowcode&数据结构】顺序表的应用
数据结构·算法·leetcode
一水鉴天39 分钟前
整体设计 逻辑系统程序 之27 拼语言整体设计 9 套程序架构优化与核心组件(CNN 改造框架 / Slave/Supervisor/ 数学工具)协同设计
人工智能·算法
小年糕是糕手1 小时前
【数据结构】双向链表“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法·链表
将车2441 小时前
C++实现二叉树搜索树
开发语言·数据结构·c++·笔记·学习
PyHaVolask2 小时前
数据结构与算法分析
数据结构·算法·图论