大家好,我是开车的阿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); } };
这个解法的核心思想是使用后序遍历来处理,递归计算每个节点为根的子树的最大产奶量,同时不断更新全局最大值。在计算过程中,对于每个节点,我们需要计算选择当前节点或者不选择当前节点的最大产奶量,并更新全局最大值。