大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
二叉树的遍历,动态规划。
题目解答方法的文字分析
题目要求从任意结点出发,一直到叶子结点走出这棵树,每次遇到一头牛就收获他的产量奶,求能收获的最大产奶量总和。这是一个典型的动态规划问题,我们可以使用后序遍历来处理。具体步骤如下:
- 我们可以编写一个递归函数
maxMilkSumHelper,它接收一个节点和一个引用的最大产奶量作为参数。 - 在
maxMilkSumHelper函数中,首先处理递归终止条件:如果当前节点为空,返回0。 - 然后,递归计算左子树和右子树的最大产奶量,分别保存在
leftMax和rightMax中。 - 接着,计算当前节点的最大产奶量,它等于当前节点的值加上左子树和右子树中较大的最大产奶量。
- 在计算过程中,将当前节点的最大产奶量与引用的最大产奶量
maxSum进行比较,如果更大,则更新maxSum。 - 最后,返回当前节点的最大产奶量,如果为负值,返回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);
}
};
这个解法的核心思想是使用后序遍历来处理,递归计算每个节点为根的子树的最大产奶量,同时不断更新全局最大值。在计算过程中,对于每个节点,我们需要计算选择当前节点或者不选择当前节点的最大产奶量,并更新全局最大值。

京公网安备 11010502036488号