鱼C论坛

 找回密码
 立即注册
查看: 192|回复: 1

递归求路径和

[复制链接]
发表于 2024-11-8 16:53:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. #     def __init__(self, x):
  4. #         self.val = x
  5. #         self.left = None
  6. #         self.right = None


  7. # 精简版,五行代码不解释
  8. class Solution:
  9.     def pathSum(self, root: TreeNode, sum: int) -> int:
  10.         def dfs(root, sumlist):
  11.             if root is None: return 0
  12.             sumlist = [num + root.val for num in sumlist] + [root.val]
  13.             return sumlist.count(sum) + dfs(root.left, sumlist) + dfs(root.right, sumlist)
  14.         return dfs(root, [])



  15. # 展开版,易理解
  16. class Solution:
  17.     def pathSum(self, root: TreeNode, sum: int) -> int:

  18.         def dfs(root, sumlist):
  19.             if root is None:
  20.                 return 0
  21.             
  22.             sumlist = [num+root.val for num in sumlist]
  23.             sumlist.append(root.val)
  24.             
  25.             count = 0
  26.             for num in sumlist:
  27.                 if num == sum:
  28.                     count += 1
  29.             # count = sumlist.count(sum)

  30.             return count + dfs(root.left, sumlist) + dfs(root.right, sumlist)

  31.         return dfs(root, [])
  32. 其中,[code]sumlist = [num+root.val for num in sumlist]
复制代码

sumlist为空时,执行该列表推导式也为空是为什么
作者:Orust
链接:https://leetcode.cn/problems/pat ... ai-ma-yong-lie-bia/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。[/code]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-8 16:54:05 | 显示全部楼层
要实现路径和的递归求解,我们需要通过深度优先搜索(DFS)遍历二叉树,并在过程中跟踪每一条路径上节点值的累加和。

在您的代码片段中,`sumlist` 是用于存储从根节点到当前节点路径上各节点的累加和。递归从根节点开始遍历,每向下走一步,就将当前节点的值加到每个路径和中,形成新的路径和列表。

以下是展开版代码中 `dfs` 函数内关键部分的详细解释:

  1. def dfs(root, sumlist):
  2.     if root is None:  # 如果当前节点为空,则返回0
  3.         return 0
  4.    
  5.     # 更新路径和列表,包括当前节点值
  6.     sumlist = [num + root.val for num in sumlist]  # 对于路径上的每一个累加和加上当前节点的值
  7.     sumlist.append(root.val)  # 还要以当前节点值为新路径起点

  8.     # 计算当前路径和列表中有多少个路径的和为目标值
  9.     count = sumlist.count(sum)

  10.     # 递归计算左右子树上的路径
  11.     return count + dfs(root.left, sumlist) + dfs(root.right, sumlist)

  12. # 初始调用
  13. return dfs(root, [])
复制代码


### 为什么 `sumlist` 是空时,执行列表推导式为空?

在 `sumlist = [num + root.val for num in sumlist]` 中,当 `sumlist` 为空时,列表推导式没有任何元素进行迭代,因此生成的结果也是一个空列表 `[]`。这意味着在此情况下,当前节点将作为新的路径起点添加到路径列表中。

### 主要步骤:
1. **初始化条件**:从根节点开始,初始路径和列表为空 `sumlist=[]`。
2. **DFS遍历**:对于每一个节点,更新路径和列表,包括本节点值。对于从根到当前节点的每个路径和,加上当前节点的值。
3. **路径和更新**:如果路径和列表存在等于目标和的路径,加1到计数器。
4. **递归调用**:分别计算左孩子和右孩子节点,传递新的路径和列表。
5. **返回结果**:通过累加所有路径和等于目标和的路径数。

通过这种方式,我们能够递归地计算二叉树中所有可能路径上和为给定值的路径数量。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 16:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表