因为要求路径,所以得从根节点开始。故用前序遍历法遍历。递归法
思路:
1.递归函数参数及返回值:
参数:根节点root 已走路径path 全局变量result
返回值:无返回值,因为在遇到叶子节点时,就操作了result.append(path) result 已通过全局变量修改
2.递归结束条件:
遇到叶子几点就将已走路径加入result result.append(path)
注意:
此步用的是 if not root.left and not root.right:
因为一旦找到叶子节点就要处理逻辑了,即result.append(path)
此外,如果 if not root: return 0 就会把这个空节点也加入路径,费劲
3.单层递归逻辑:
若非叶子节点,则将root.val加入path后,继续递归遍历左右子树。
其中 self.traversal(root.left, path + '->' , result) 的 path + '->' 隐藏了回溯步骤
因为path是一个局部变量,本轮递归函数结束后,就分崩离析了,就回到上一层递归的残局了。即回到了上一轮遍历节点的path路径了。
# 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 binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
if not root: return []
path = ''
result = []
self.traversal(root, path, result)
return result
def traversal(self, root: 'TreeNode', path: str, result: List[str]) -> None:
path += str(root.val)
if not root.left and not root.right:
result.append(path)
if root.left: self.traversal(root.left, path + '->' , result)
if root.right: self.traversal(root.right, path + '->', result)