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
相关推荐
passer__jw7671 小时前
【LeetCode】【算法】3. 无重复字符的最长子串
算法·leetcode
passer__jw7671 小时前
【LeetCode】【算法】21. 合并两个有序链表
算法·leetcode·链表
sweetheart7-71 小时前
LeetCode22. 括号生成(2024冬季每日一题 2)
算法·深度优先·力扣·dfs·左右括号匹配
__AtYou__2 小时前
Golang | Leetcode Golang题解之第557题反转字符串中的单词III
leetcode·golang·题解
李元豪2 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
2401_858286112 小时前
L7.【LeetCode笔记】相交链表
笔记·leetcode·链表
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
景鹤4 小时前
【算法】递归+回溯+剪枝:78.子集
算法·机器学习·剪枝
_OLi_4 小时前
力扣 LeetCode 704. 二分查找(Day1:数组)
算法·leetcode·职场和发展