原题链接🔗:二叉树中的最大路径和
难度:困难⭐️⭐️⭐️
题目
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 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
题解
- 解题思路:
LeetCode 上的 “二叉树中的最大路径和” 问题是一个关于二叉树的算法题,要求找出二叉树中任意节点组成的路径的最大和。这个问题的难度在于路径可以是任意的,不一定是从根到叶子的路径。
解题思路通常包括以下几个步骤:
理解问题:首先,要清楚地理解问题的要求,即找出二叉树中任意节点组成的路径的最大和。
递归遍历:由于问题涉及到路径,递归是解决二叉树问题的一种常见方法。我们需要递归遍历二叉树的每个节点。
路径和的计算:在递归过程中,我们需要计算从当前节点到任何叶子节点的路径和。这包括当前节点的值,以及左右子树中较小的路径和,因为如果一个子树的路径和为负,那么它将不会对总和产生贡献。
更新全局最大值:在递归的过程中,我们需要更新一个全局变量,以记录到目前为止找到的最大路径和。
考虑边界情况:在递归的过程中,需要考虑叶子节点的情况,因为叶子节点没有子节点,其路径和就是其自身的值。
回溯:在递归回溯的过程中,需要将之前计算的路径和传递回父节点,以便计算包含当前节点的路径和。
优化:在计算路径和时,可以只考虑正的路径和,因为负的路径和不会对最大值有贡献。
- c++ demo:
#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
- 代码仓库地址:max_gain