📜  门|门 IT 2008 |问题 5(1)

📅  最后修改于: 2023-12-03 15:12:47.022000             🧑  作者: Mango

门|门 IT 2008 |问题 5

简介

这是一道经典的编程问题,通常被用来测试程序员的算法和编程能力。它需要使用递归实现,并且需要处理一些边界情况。

题目

给定一颗二叉树,求出从根节点到叶子节点的所有路径,并且输出这些路径。

例如,对于以下二叉树:

      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 函数中,我们首先需要对当前节点进行判空。如果当前节点为空,则直接返回。否则,我们需要将当前节点加入到路径中,并且判断当前节点是否为叶子节点。如果当前节点是叶子节点,则将当前路径保存起来。否则,我们继续递归进入左子树和右子树。

递归完成后,我们需要将当前节点从路径中删除,以便继续搜索其他路径。最后,我们将所有路径保存在一个列表中,并且返回这个列表。

参考文献