【树】B030_LC_分裂二叉树的最大乘积(求子树和)

一、Problem

【树】B030_LC_分裂二叉树的最大乘积(求子树和)_第1张图片

Input: root = [1,2,3,4,5,6]
Output: 110
Explanation: Remove the red edge and get 2 binary trees with sum 11 and 10. 
Their product is 110 (11*10)

Constraints:

Each tree has at most 50000 nodes and at least 2 nodes.
Each node’s value is between [1, 10000].

二、Solution

方法一:求子树和

  • 求一个顶点的子树和 sub,然后再求非此顶点其他结点的总和不太现实。
  • 不如先求整颗树的总和 tot,然后求出一棵子树的和 sub,用 tot - sub 就可得到其他结点的总和了。
class Solution {
	long tot, max, MOD = (long) 1e9+7;
	long dfs1(TreeNode root) {
		if (root == null) return 0;
		return root.val + dfs1(root.left) + dfs1(root.right);
	}
	long dfs2(TreeNode root) {
		if (root == null) return 0;
		long sub = root.val + dfs2(root.left) + dfs2(root.right);
		max = Math.max(max, (tot - sub) * sub);
        return sub;
	}
    public int maxProduct(TreeNode root) {
        tot = dfs1(root);
		dfs2(root);
		return (int) (max % MOD);
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

你可能感兴趣的:(#,树)