📅  最后修改于: 2023-12-03 15:25:45.191000             🧑  作者: Mango
给定一棵二叉树和一个整数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)解决。我们需要两个关键步骤:
在实现上,我们可以使用递归的方式实现DFS。我们递归地搜索整棵树,并在递归过程中:
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)。