1. 问题背景与理解
这道题目来自力扣(LeetCode)的每日一题系列,属于二叉树类问题的变种。题目要求我们找到一种分割二叉树的方式,使得分割后两棵子树节点值乘积最大化。这类问题在实际应用中其实很有意义,比如在分布式系统中进行数据分片时,如何平衡两个分片的数据量。
我第一次看到这个问题时,首先想到的是需要遍历整棵树,计算所有可能的分割方式。但直接暴力计算显然效率太低,对于节点数N的情况时间复杂度会达到O(N^2)。于是我开始思考如何优化这个过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 问题转化
首先我们需要明确几个关键点:
- 分割一条边意味着将树分成两棵子树
- 需要计算两棵子树的节点值之和
- 目标是使这两个和的乘积最大
这提示我们需要:
- 计算整棵树的总和(所有节点值之和)
- 对于每条边,计算其下方子树的和
- 上方子树的和就是总和减去下方子树的和
- 计算这两个和的乘积,记录最大值
2.2 算法选择
基于上述分析,后序遍历(Post-order Traversal)是最合适的选择:
- 后序遍历可以自底向上计算每个子树的和
- 遍历过程中可以记录全局最大值
- 只需要一次遍历即可完成所有计算
时间复杂度:O(N),每个节点只访问一次
空间复杂度:O(H),递归栈的深度,H是树的高度
3. 详细实现步骤
3.1 数据结构定义
首先定义二叉树节点:
python复制class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
3.2 核心算法实现
python复制def maxProduct(root):
# 先计算整棵树的总和
total_sum = 0
stack = [root]
while stack:
node = stack.pop()
if node:
total_sum += node.val
stack
