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 * 10^4^]
  • -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
相关推荐
大二转专业2 小时前
408算法题leetcode--第24天
考研·算法·leetcode
zaim12 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
学习使我变快乐2 小时前
C++:const成员
开发语言·c++
凭栏落花侧2 小时前
决策树:简单易懂的预测模型
人工智能·算法·决策树·机器学习·信息可视化·数据挖掘·数据分析
hong_zc3 小时前
算法【Java】—— 二叉树的深搜
java·算法
吱吱鼠叔4 小时前
MATLAB计算与建模常见函数:5.曲线拟合
算法·机器学习·matlab
嵌入式AI的盲5 小时前
数组指针和指针数组
数据结构·算法
一律清风5 小时前
QT-文件创建时间修改器
c++·qt
风清扬_jd5 小时前
Chromium 如何定义一个chrome.settingsPrivate接口给前端调用c++
前端·c++·chrome
Death2006 小时前
Qt 6 相比 Qt 5 的主要提升与更新
开发语言·c++·qt·交互·数据可视化