大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

二叉树的遍历,动态规划。

题目解答方法的文字分析

题目要求从任意结点出发,一直到叶子结点走出这棵树,每次遇到一头牛就收获他的产量奶,求能收获的最大产奶量总和。这是一个典型的动态规划问题,我们可以使用后序遍历来处理。具体步骤如下:

  1. 我们可以编写一个递归函数 maxMilkSumHelper,它接收一个节点和一个引用的最大产奶量作为参数。
  2. maxMilkSumHelper 函数中,首先处理递归终止条件:如果当前节点为空,返回0。
  3. 然后,递归计算左子树和右子树的最大产奶量,分别保存在 leftMaxrightMax 中。
  4. 接着,计算当前节点的最大产奶量,它等于当前节点的值加上左子树和右子树中较大的最大产奶量。
  5. 在计算过程中,将当前节点的最大产奶量与引用的最大产奶量 maxSum 进行比较,如果更大,则更新 maxSum
  6. 最后,返回当前节点的最大产奶量,如果为负值,返回0,表示不选择当前节点。

本题解析所用的编程语言

C++

完整且正确的编程代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    int maxMilkSum(TreeNode* root) {
        int maxSum = 0;
        // 调用递归函数,得到最大产奶量总和
        maxMilkSumHelper(root, maxSum);
        return maxSum;
    }
    
    // 递归函数:计算每个节点为根的子树的最大产奶量
    int maxMilkSumHelper(TreeNode* root, int& maxSum) {
        if (!root) {
            return 0;
        }
        
        // 递归计算左子树和右子树的最大产奶量
        int leftMax = maxMilkSumHelper(root->left, maxSum);
        int rightMax = maxMilkSumHelper(root->right, maxSum);
        
        // 计算当前节点的最大产奶量
        int currentMax = max(root->val + leftMax, root->val + rightMax);
        
        // 更新全局最大值
        maxSum = max(maxSum, max(currentMax, root->val + leftMax + rightMax));
        
        // 返回当前节点的最大产奶量
        return max(currentMax, 0);
    }
};

这个解法的核心思想是使用后序遍历来处理,递归计算每个节点为根的子树的最大产奶量,同时不断更新全局最大值。在计算过程中,对于每个节点,我们需要计算选择当前节点或者不选择当前节点的最大产奶量,并更新全局最大值。

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!