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

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

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

介绍

这是一个关于树遍历中的问题8的介绍,主要涉及以下内容:

  • 问题描述
  • 解决方案
  • 代码示例
  • 复杂度分析
问题描述

给定一棵二叉树和一个整数sum,求出所有从根节点到叶子节点的路径中,路径上节点的值之和等于sum的路径。

示例:

给定二叉树如下:

      5
     / \
    4   8
   /   / \
  11  13  4
 /  \    / \
7    2  5   1

sum = 22,则符合条件的路径有:[5, 4, 11, 2], [5, 8, 4, 5]。

解决方案

我们可以使用 DFS(深度优先搜索)算法遍历该二叉树的所有路径。在遍历过程中,我们需要记录当前遍历路径的节点值、路径和以及路径本身,如果某一路径满足条件,就把该路径加入到结果集中。

具体实现步骤如下:

  1. 定义一个全局变量 res 用来保存所有符合条件的路径;
  2. 从根节点开始,遍历该二叉树;
  3. 对于当前遍历到的节点,先将其值存入 path 数组中,并将节点值与 sum 取差值存入 sum 变量中;
  4. 如果当前节点是叶子节点,并且 sum 的值为0,则说明该路径满足条件,将 path 数组加入到 res 中;
  5. 递归遍历左子树,遍历完成后从 path 中移除当前节点的值,将 sum 加上当前节点的值;
  6. 递归遍历右子树,遍历完成后同样从 path 中移除当前节点的值,将 sum 加上当前节点的值。
代码示例

下面是本题的 Python 代码示例:

class Solution:
    def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
        res = []
        path = []

        def dfs(node, s):
            if not node:
                return
            path.append(node.val)
            s -= node.val
            if not node.left and not node.right and s == 0:
                res.append(path[:])
            dfs(node.left, s)
            dfs(node.right, s)
            path.pop()
            s += node.val
        
        dfs(root, sum)
        return res
复杂度分析

时间复杂度:$O(NlogN)$

遍历整颗二叉树需要$O(N)$时间复杂度,每个节点都需要进行一次 DFS 操作,因此时间复杂度为 $O(NlogN)$。

空间复杂度:$O(logN)$

DFS 在栈上执行,因此空间复杂度为 DFS 栈的深度,最坏情况下为 $O(logN)$。