Terence888 发表于 2024-10-28 15:54:47

二叉树的最大路径和

# Definition for a binary tree node.
# class TreeNode:
#   def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxPathSum(self, root: Optional) -> int:
      self.res = 0 #初始化全局变量
      def helper(node):
            if not node: return 0 #如果没有节点(是叶子结点),返回0
            self.res = max(self.res,(helper(node.left) + helper(node.right) + node.val)) #结果为左右子树最大权值加上根节点的值
            return max(0,max(helper(node.left),helper(node.right)) + node.val)#最大值为左右子树
      helper(root)
      return self.res

帮我逐层分析一下,尤其不懂helper函数的返回值为什么是max(0,max(helper(node.left),helper(node.right)) + node.val)
其中,root =
[-10,9,20,null,null,15,7]

FishC 发表于 2024-10-28 16:01:03

好的,我们来逐层分析这个程序,尤其是 `helper` 函数。

### 目标
我们需要找到二叉树中的最大路径和,路径可以从任何节点开始和结束。

### 程序解析

1. **类和函数定义**

   class Solution:
       def maxPathSum(self, root: Optional) -> int:
         self.res = float('-inf')# 初始化最大值为负无穷
         def helper(node):
               if not node:
                   return 0
               ...
         ...
   `maxPathSum` 函数调用 `helper` 函数,递归计算路径和值。

2. **`helper` 函数**

   def helper(node):
       if not node:
         return 0
   - 如果 `node` 是 `None`,返回 0,因为空节点的贡献为 0。

3. **递归计算**

   left = max(0, helper(node.left))
   right = max(0, helper(node.right))
   - 对于每一个 `node`,计算其左子树和右子树的最大贡献路径和。
   - `max(0, ...)` 的作用是忽略负路径,只考虑非负路径。

4. **更新全局最大路径和**

   self.res = max(self.res, left + right + node.val)
   - 计算通过当前 `node` 的路径和,包括其值、左子树贡献和右子树贡献,并更新全局最大值 `self.res`。

5. **返回值**

   return max(left, right) + node.val
   - 返回以当前节点为根的最大路径贡献,即当前节点值加上左/右子树中较大的路径贡献。
   - 这个返回值供递归调用的父节点使用。

### 总结

- `helper` 函数的返回值并不是当前节点的最大路径和,而是给父节点提供的最大路径贡献值。
- `self.res` 是全局变量,存储到目前为止的最大路径和,包括从任意节点开始和结束的路径。

这种方法有效利用了递归遍历了二叉树的所有节点,最后我们得到了最大路径和。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 二叉树的最大路径和