题目描述(中等难度)
算法
(递归)
- 乘积 = 某个节点下所有子节点的和 *(整个树的和 - 某个节点下所有子节点的和)
- 后序遍历每个结点,更新最大值
- 注意:先用long long存数据,另外在max函数中不要先取模 解释
后序遍历的好处:后序遍历可以从叶子结点开始,先求出子树的状态,然后更新root结点,这样自底向上可以减少大量重复的计算
时间复杂度是 ,空间复杂度是 :需要使用系统栈空间
C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// 乘积 = 某个节点下所有子节点的和 *(整个树的和 - 某个节点下所有子节点的和)
typedef long long LL;
LL rmax = 0;
LL Total = 0;
static const LL mod = 1e9 + 7;
// 后序遍历,遍历每个结点,更新最大值
LL TreeSum(TreeNode* root) {
if (!root) return 0;
LL left = TreeSum(root->left);
LL right = TreeSum(root->right);
LL subsum = left + right + root->val;
rmax = max(rmax, (Total - subsum) * subsum); // 不能先取模
return subsum;
}
int maxProduct(TreeNode* root) {
if (!root) return 0;
Total = TreeSum(root);
rmax = 0;
TreeSum(root);
return rmax % mod;
}
};
写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)