📜  数据结构 |树遍历 |问题 11(1)

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

数据结构 | 树遍历 | 问题 11

树遍历是树结构中的基本操作之一,指按照一定规则遍历树中的所有节点。

问题 11 是 LeetCode 上的一道关于树遍历的问题,题目描述如下:

给定一个二叉树,返回所有从根节点到叶子节点的路径。

示例:

输入:

   1
 /   \
2     3
 \
  5

输出:

["1->2->5", "1->3"]

在解决这道问题之前,我们需要了解树的遍历方式。

树的遍历方式

树的遍历方式有三种:

  1. 前序遍历:先访问根节点,再访问左子树,最后访问右子树。
  2. 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
  3. 后序遍历:先访问左子树,再访问右子树,最后访问根节点。

我们可以使用递归或栈来实现树的遍历,下面是前序遍历的递归实现代码:

def preorderTraversal(root):
    if not root:
        return []
    res = [root.val]  # 记录遍历结果
    res += preorderTraversal(root.left)  # 遍历左子树
    res += preorderTraversal(root.right)  # 遍历右子树
    return res
解题思路

在本题中,我们要找到从根节点到叶子节点的所有路径。因此,我们需要对树进行深度优先遍历,同时记录遍历的路径。

具体而言,我们可以使用回溯法,在遍历过程中保存当前路径,当遍历到叶子节点时,将当前路径加入结果集中,同时回溯至上一层节点,继续遍历。

下面是 Python 的实现代码:

def binaryTreePaths(root):
    res = []  # 记录遍历结果
    path = []  # 当前路径
    dfs(root, path, res)
    return res

def dfs(root, path, res):
    if not root:
        return
    path.append(str(root.val))  # 加入当前节点
    if not root.left and not root.right:  # 遍历到叶子节点
        res.append('->'.join(path))  # 将当前路径加入结果集
        path.pop()  # 回溯
        return
    dfs(root.left, path, res)  # 遍历左子树
    dfs(root.right, path, res)  # 遍历右子树
    path.pop()  # 回溯
总结

本文介绍了树的遍历方式以及如何使用回溯法遍历二叉树并找到所有从根节点到叶子节点的路径。这是树结构的基本操作,也是算法和数据结构中必会的知识点之一。掌握树的遍历方式和回溯法的应用,对于解决相应问题具有重要意义。