📅  最后修改于: 2023-12-03 14:58:33.700000             🧑  作者: Mango
问题 11 是 Sudo GATE 2020 Mock III(2019 年 1 月 24 日)中的一个编程问题。这个问题侧重于测试程序员对于二叉树和递归的理解,以及他们是否能够处理二叉树的各种操作。
给定一个二叉树和一个整数 k,编写一个程序来找到二叉树中所有路径长度等于 k 的路径的数量。路径的长度是指从一个节点到另一个节点的边的数量。路径可以从任何节点开始和结束,但是必须按照根到叶子的方向。
函数的输入是一个二叉树的根节点和一个整数 k。
函数的输出是一个整数,表示二叉树中路径长度等于 k 的路径的数量。
输入:
1
/ \
3 -1
/ \ / \
2 1 4 5
k = 3
输出:
2
解释: 有两条路径长度等于 3 的路径: 1 -> 3 -> -1 和 3 -> 2 -> 1。
问题可通过深度优先搜索(DFS)和递归来解决。我们可以从根节点开始,递归地检查每个节点,查找从该节点出发的路径是否存在,且路径长度等于 k。为了完成这个任务,我们可以创建一个递归函数,并传递当前节点、当前路径的长度和目标长度 k。每次递归调用时,将当前节点的值与当前路径长度相加,如果等于目标长度 k,则路径数量加一。然后递归调用函数,分别从左子树和右子树开始,将路径长度加 1。最后返回路径数量。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def count_paths(root, k):
if not root:
return 0
return count_paths_from_node(root, k) + count_paths(root.left, k) + count_paths(root.right, k)
def count_paths_from_node(node, k):
if not node:
return 0
count = 0
if node.val == k:
count += 1
count += count_paths_from_node(node.left, k - node.val) + count_paths_from_node(node.right, k - node.val)
return count