📅  最后修改于: 2023-12-03 15:23:28.943000             🧑  作者: Mango
在二叉树中,找到最大和叶到根路径是一个经典的问题。它要求我们找到一条从根节点到叶子节点的路径,使得路径上所有节点的和最大。
解决这个问题的一种常见的方法是使用递归。我们从根节点开始往下走,一直到叶子节点,然后返回每个子树中的最大和路径。对于每个子树,我们可以计算从左子节点或右子节点到该子树根节点的最大和路径,然后取较大值加上根节点的值,即可得到该子树的最大和路径。
代码如下:
int maxPathSum(TreeNode* root) {
int maxSum = INT_MIN;
getMaxSum(root, maxSum);
return maxSum;
}
int getMaxSum(TreeNode* root, int& maxSum) {
if (root == nullptr) {
return 0;
}
int leftSum = max(0, getMaxSum(root->left, maxSum));
int rightSum = max(0, getMaxSum(root->right, maxSum));
maxSum = max(maxSum, leftSum + rightSum + root->val);
return max(leftSum, rightSum) + root->val;
}
在这个递归方法中,我们使用了一个引用类型的变量 maxSum
来记录全局的最大和路径。我们定义了一个子函数 getMaxSum
来计算从根节点到当前节点的最大和路径,并将其返回。
在 getMaxSum
函数中,我们首先判断当前节点是否为空。如果是,则返回 0。然后我们分别递归计算当前节点的左子树和右子树的最大和路径,分别记为 leftSum
和 rightSum
。由于我们只考虑从叶子节点到根节点的路径,所以我们对于负数的路径长度直接置为 0。
最后,我们计算当前节点的最大和路径 leftSum + rightSum + root->val
,并与全局最大和路径 maxSum
比较,更新其中较大的值。然后,我们将 leftSum
和 rightSum
中较大的值加上当前节点的值,并返回。
在二叉树中找到最大和叶到根路径是一个经典的问题,我们可以使用递归的方法解决。使用递归可以将整个问题的复杂度大大降低,同时也方便了我们的代码实现。