@@ -416,6 +416,8 @@ class Solution {
416416Python:
417417
4184180112.路径总和
419+
420+ ** 递归**
419421``` python
420422# Definition for a binary tree node.
421423# class TreeNode:
@@ -424,64 +426,93 @@ Python:
424426# self.left = left
425427# self.right = right
426428
427- // 递归法
428-
429429class Solution :
430430 def hasPathSum (self , root : TreeNode, targetSum : int ) -> bool :
431- def isornot (root ,targetSum )->bool :
432- if (not root.left) and (not root.right) and targetSum == 0 :return True // 遇到叶子节点,并且计数为0
433- if (not root.left) and (not root.right):return False // 遇到叶子节点,计数不为0
431+ def isornot (root , targetSum ) -> bool :
432+ if (not root.left) and (not root.right) and targetSum == 0 :
433+ return True # 遇到叶子节点,并且计数为0
434+ if (not root.left) and (not root.right):
435+ return False # 遇到叶子节点,计数不为0
434436 if root.left:
435- targetSum -= root.left.val // 左节点
436- if isornot(root.left,targetSum):return True // 递归,处理左节点
437- targetSum += root.left.val // 回溯
437+ targetSum -= root.left.val # 左节点
438+ if isornot(root.left, targetSum): return True # 递归,处理左节点
439+ targetSum += root.left.val # 回溯
438440 if root.right:
439- targetSum -= root.right.val // 右节点
440- if isornot(root.right,targetSum):return True // 递归,处理右节点
441- targetSum += root.right.val // 回溯
441+ targetSum -= root.right.val # 右节点
442+ if isornot(root.right, targetSum): return True # 递归,处理右节点
443+ targetSum += root.right.val # 回溯
442444 return False
443-
444- if root == None :return False // 别忘记处理空TreeNode
445- else :return isornot(root,targetSum- root.val)
445+
446+ if root == None :
447+ return False # 别忘记处理空TreeNode
448+ else :
449+ return isornot(root, targetSum - root.val)
446450```
447451
452+ ** 迭代 - 层序遍历**
453+ ``` python
454+ class Solution :
455+ def hasPathSum (self , root : TreeNode, targetSum : int ) -> bool :
456+ if not root:
457+ return False
458+
459+ stack = [] # [(当前节点,路径数值), ...]
460+ stack.append((root, root.val))
461+
462+ while stack:
463+ cur_node, path_sum = stack.pop()
464+
465+ if not cur_node.left and not cur_node.right and path_sum == targetSum:
466+ return True
467+
468+ if cur_node.right:
469+ stack.append((cur_node.right, path_sum + cur_node.right.val))
470+
471+ if cur_node.left:
472+ stack.append((cur_node.left, path_sum + cur_node.left.val))
473+
474+ return False
475+ ```
4484760113.路径总和-ii
477+
478+ ** 递归**
449479``` python
450480# Definition for a binary tree node.
451481# class TreeNode:
452482# def __init__(self, val=0, left=None, right=None):
453483# self.val = val
454484# self.left = left
455485# self.right = right
456- // 递归法
457486class Solution :
458487 def pathSum (self , root : TreeNode, targetSum : int ) -> List[List[int ]]:
459- path= []
460- res= []
461- def pathes (root ,targetSum ):
462- if (not root.left) and (not root.right) and targetSum == 0 : // 遇到叶子节点,并且计数为0
463- res.append(path[:]) // 找到一种路径,记录到res中,注意必须是path[:]而不是path
464- return
465- if (not root.left) and (not root.right):return // 遇到叶子节点直接返回
466- if root.left: // 左
467- targetSum -= root.left.val
468- path.append(root.left.val) // 递归前记录节点
469- pathes(root.left,targetSum) // 递归
470- targetSum += root.left.val // 回溯
471- path.pop() // 回溯
472- if root.right: // 右
473- targetSum -= root.right.val
474- path.append(root.right.val) // 递归前记录节点
475- pathes(root.right,targetSum) // 递归
476- targetSum += root.right.val // 回溯
477- path.pop() // 回溯
478- return
479-
480- if root == None :return [] // 处理空TreeNode
481- else :
482- path.append(root.val) // 首先处理根节点
483- pathes(root,targetSum- root.val)
484- return res
488+
489+ def traversal (cur_node , remain ):
490+ if not cur_node.left and not cur_node.right and remain == 0 :
491+ result.append(path[:])
492+ return
493+
494+ if not cur_node.left and not cur_node.right: return
495+
496+ if cur_node.left:
497+ path.append(cur_node.left.val)
498+ remain -= cur_node.left.val
499+ traversal(cur_node.left, remain)
500+ path.pop()
501+ remain += cur_node.left.val
502+
503+ if cur_node.right:
504+ path.append(cur_node.right.val)
505+ remain -= cur_node.right.val
506+ traversal(cur_node.right, remain)
507+ path.pop()
508+ remain += cur_node.right.val
509+
510+ result, path = [], []
511+ if not root:
512+ return []
513+ path.append(root.val)
514+ traversal(root, targetSum - root.val)
515+ return result
485516```
486517
487518Go:
0 commit comments