题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/binary-tree-paths
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入: 1 / \ 2 3 \ 5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3先看题目,题目要求返回所有从根节点到叶子结点的路径。
那么在这里,我们可以考虑使用深度优先搜索(DFS)的方法。题目也有说明,叶子节点是指没有子节点的节点,而 DFS 在遍历搜索二叉树时,会对当前节点及其子节点进行判断。
具体实现直接看代码,如下:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def binaryTreePaths(self, root: TreeNode) -> List[str]: if not root: return [] def dfs(node, path): if not node.left and not node.right: path += str(node.val) paths.append(path) return path += str(node.val) + '->' if node.left: dfs(node.left, path) if node.right: dfs(node.right, path) paths = [] dfs(root, '') return paths当然,我们也可以使用广度优先搜索(BFS)的方法实现,这里我们需要借助辅助队列来实现。
具体直接看代码,如下:
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None from collections import deque class Solution: def binaryTreePaths(self, root: TreeNode) -> List[str]: if not root: return [] res = [] # 声明两个队列,两个其中一个存储节点,其中一个存储根到节点的路径 nodes = deque([root]) paths = deque([str(root.val)]) while nodes: node = nodes.popleft() path = paths.popleft() # 到达叶子节点,路径放入返回列表中 if not node.left and not node.right: res.append(path) if node.left: paths.append(path + '->' + str(node.left.val)) nodes.append(node.left) if node.right: paths.append(path + '->' + str(node.right.val)) nodes.append(node.right) return res公众号 【书所集录】
