Skip to content

Commit b43e177

Browse files
Merge pull request youngyangyang04#536 from KelvinG-611/112.路径总和
更改 0112.路径总和.md Python3 代码.
2 parents 58914d6 + 440e04f commit b43e177

File tree

1 file changed

+72
-41
lines changed

1 file changed

+72
-41
lines changed

problems/0112.路径总和.md

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,8 @@ class Solution {
416416
Python:
417417

418418
0112.路径总和
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-
429429
class 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+
```
448476
0113.路径总和-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-
//递归法
457486
class 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

487518
Go:

0 commit comments

Comments
 (0)