📌  相关文章
📜  打印二叉树的所有路径,每条路径中的最大元素大于或等于 K(1)

📅  最后修改于: 2023-12-03 14:54:27.602000             🧑  作者: Mango

题目描述

给定一个二叉树和一个整数K,打印二叉树的所有路径,使得每条路径中的最大元素大于或等于 K。

解题思路

此题需要利用回溯法对树进行遍历。具体步骤如下:

  1. 定义空列表 path 用于存储遍历路径,定义空列表 res 用于存储结果。

  2. 从根节点开始遍历,将根节点加入 path

  3. 递归遍历左子树,将左子节点加入 path,并更新最大值。

  4. 递归遍历右子树,将右子节点加入 path,并更新最大值。

  5. 若当前节点为叶子节点,判断当前路径的最大值是否大于或等于 K,若是,则将 path 添加到 res 中。

  6. 回溯操作,将当前节点从 path 中删除,返回到父节点,继续遍历。

  7. 遍历完成后,返回 res

代码实现

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def findPaths(self, root: TreeNode, K: int) -> List[List[int]]:
        res = []
        path = []
        if not root:
            return res
        
        def dfs(root, path, max_value):
            if not root:
                return
            path.append(root.val)
            max_value = max(max_value, root.val)  # 更新最大值
            if not root.left and not root.right:  # 判断是否为叶子节点
                if max_value >= K:
                    res.append(path[:])
            else:
                dfs(root.left, path, max_value)
                dfs(root.right, path, max_value)
            path.pop()  # 回溯操作,将当前节点从路径中删除
        
        dfs(root, path, root.val)
        return res

复杂度分析

  • 时间复杂度:$O(nm)$,其中 $n$ 为二叉树的节点数,$m$ 为符合条件的路径数。对于每条路径,需要遍历其每个节点,时间复杂度为 $O(n)$,因此总时间复杂度为 $O(nm)$。
  • 空间复杂度:$O(n)$,其中 $n$ 为二叉树的节点数,为存储所有路径所需的空间。在遍历过程中,只需要额外存储当前路径信息,因此空间复杂度为 $O(n)$。