LeetCode 题解 | 1339. 分裂二叉树的最大乘积(递归 自底向上 C++)

题目描述(中等难度)

原题链接
在这里插入图片描述

算法

(递归) O ( n ) O(n)

  • 乘积 = 某个节点下所有子节点的和 *(整个树的和 - 某个节点下所有子节点的和)
  • 后序遍历每个结点,更新最大值
  • 注意:先用long long存数据,另外在max函数中不要先取模 解释
    后序遍历的好处:后序遍历可以从叶子结点开始,先求出子树的状态,然后更新root结点,这样自底向上可以减少大量重复的计算
    时间复杂度是 O ( n ) O(n) ,空间复杂度是 O ( n ) O(n) :需要使用系统栈空间

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;
    }
};

写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)

发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104267790