📜  在二叉树中找到最大和叶到根路径(1)

📅  最后修改于: 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。然后我们分别递归计算当前节点的左子树和右子树的最大和路径,分别记为 leftSumrightSum。由于我们只考虑从叶子节点到根节点的路径,所以我们对于负数的路径长度直接置为 0。

最后,我们计算当前节点的最大和路径 leftSum + rightSum + root->val,并与全局最大和路径 maxSum 比较,更新其中较大的值。然后,我们将 leftSumrightSum 中较大的值加上当前节点的值,并返回。

总结

在二叉树中找到最大和叶到根路径是一个经典的问题,我们可以使用递归的方法解决。使用递归可以将整个问题的复杂度大大降低,同时也方便了我们的代码实现。