📅  最后修改于: 2023-12-03 15:12:47.022000             🧑  作者: Mango
这是一道经典的编程问题,通常被用来测试程序员的算法和编程能力。它需要使用递归实现,并且需要处理一些边界情况。
给定一颗二叉树,求出从根节点到叶子节点的所有路径,并且输出这些路径。
例如,对于以下二叉树:
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
所有路径为:
[
[5,4,11,7],
[5,4,11,2],
[5,8,13],
[5,8,4,5],
[5,8,4,1]
]
这道题目可以使用递归解决。对于每一条路径,我们可以使用一个列表来保存当前路径上的所有节点,如果遇到叶子节点,就将当前路径保存起来。
递归的时候,我们需要将当前节点加入到路径中,然后以当前节点为根节点进入左子树和右子树递归。递归完成后,我们需要将当前节点从路径中删除,以便继续搜索其他路径。
下面是一个使用Python实现的示例代码:
def binaryTreePaths(root):
def dfs(root, path, paths):
if root:
path.append(str(root.val))
if not root.left and not root.right:
paths.append("->".join(path))
dfs(root.left, path, paths)
dfs(root.right, path, paths)
path.pop()
paths = []
dfs(root, [], paths)
return paths
这段程序定义了一个嵌套的函数 dfs
,它采用了先序遍历的方式对二叉树进行遍历,并且将每条路径保存在一个列表中。
在 dfs
函数中,我们首先需要对当前节点进行判空。如果当前节点为空,则直接返回。否则,我们需要将当前节点加入到路径中,并且判断当前节点是否为叶子节点。如果当前节点是叶子节点,则将当前路径保存起来。否则,我们继续递归进入左子树和右子树。
递归完成后,我们需要将当前节点从路径中删除,以便继续搜索其他路径。最后,我们将所有路径保存在一个列表中,并且返回这个列表。