📜  打印二叉树的所有路径,其中每个路径中的最大元素大于或等于K(1)

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

打印二叉树的所有路径(最大元素大于等于K)

问题描述

给定一棵二叉树和一个整数K,找出所有从根节点到叶节点的路径,路径上的最大元素大于等于K。

例子
    # 样例输入
    root = TreeNode(5)
    root.left = TreeNode(4)
    root.right = TreeNode(8)
    root.left.left = TreeNode(11)
    root.left.left.left = TreeNode(7)
    root.left.left.right = TreeNode(2)
    root.right.left = TreeNode(13)
    root.right.right = TreeNode(4)
    root.right.right.left = TreeNode(5)
    root.right.right.right = TreeNode(1)
    k = 22

    # 样例输出
    ["5->8->13", "5->8->4->5"]
思路

此问题可以通过深度优先搜索(DFS)解决。我们需要两个关键步骤:

  1. 搜索整棵树,找到所有从根节点到叶节点的路径;
  2. 对于每个找到的路径,检查路径上的最大元素是否满足条件(大于等于K),如果满足条件,将路径加入结果集合中。

在实现上,我们可以使用递归的方式实现DFS。我们递归地搜索整棵树,并在递归过程中:

  1. 记录当前节点的值和路径;
  2. 如果当前节点是叶节点并且路径上的最大值大于等于K,则将路径加入结果集合中。
代码实现
class Solution:
    def findPath(self, root: TreeNode, k: int) -> List[str]:
        res = []
        if not root:
            return res

        def dfs(node, path):
            if not node:
                return

            # 记录路径信息
            path.append(node.val)

            # 如果当前节点是叶节点,并且路径上的最大值大于等于k,则将路径加入结果列表
            if not node.left and not node.right and max(path) >= k:
                res.append('->'.join([str(num) for num in path]))

            # 递归处理左右子节点
            dfs(node.left, path)
            dfs(node.right, path)

            # 回溯,将当前节点从路径中删除
            path.pop()

        dfs(root, [])
        return res
时间复杂度

因为我们遍历整棵树,所以时间复杂度为O(n),其中n为树中节点的数量。

空间复杂度

由于我们需要将路径信息存储下来,所以空间复杂度为O(h),其中h为树的高度。在最坏情况下,树的高度为n,所以空间复杂度为O(n)。