Python 根到叶算法错误
为以下问题编写了不必要的复杂解决方案: 给定一个二叉树和一个和,确定该树是否有 根到叶的路径,以便将路径上的所有值相加 等于给定的和 不管怎样,我正在试着调试这里出了什么问题。我使用了一个命名的元组,这样我就可以跟踪数字是否已找到以及运行和,但运行和的增量似乎永远不会超过零。但是,在任何给定的叶节点上,运行和都将是叶节点的值,在下一次迭代中,运行和应按当前运行和递增。有人知道我的“信念的递归飞跃”有什么问题吗Python 根到叶算法错误,python,algorithm,recursion,binary-tree,Python,Algorithm,Recursion,Binary Tree,为以下问题编写了不必要的复杂解决方案: 给定一个二叉树和一个和,确定该树是否有 根到叶的路径,以便将路径上的所有值相加 等于给定的和 不管怎样,我正在试着调试这里出了什么问题。我使用了一个命名的元组,这样我就可以跟踪数字是否已找到以及运行和,但运行和的增量似乎永远不会超过零。但是,在任何给定的叶节点上,运行和都将是叶节点的值,在下一次迭代中,运行和应按当前运行和递增。有人知道我的“信念的递归飞跃”有什么问题吗 编辑:我意识到这实际上只是检查任何路径(不以叶结尾)是否具有正确的值,但我的问题仍然在
编辑:我意识到这实际上只是检查任何路径(不以叶结尾)是否具有正确的值,但我的问题仍然在于理解为什么运行总和没有正确递增。您可以保留路径的运行列表作为递归函数/方法签名的一部分,并使用生成器在右节点和左节点上调用函数/方法。生成器将使您能够查找从起始节点延伸的路径。为简单起见,我将解决方案实现为类方法:
class Tree:
def __init__(self, *args):
self.__dict__ = dict(zip(['value', 'left', 'right'], args))
def get_sums(self, current = []):
if self.left is None:
yield current + [self.value]
else:
yield from self.left.get_sums(current+[self.value])
if self.right is None:
yield current+[self.value]
else:
yield from self.right.get_sums(current+[self.value])
tree = Tree(4, Tree(10, Tree(4, Tree(7, None, None), Tree(6, None, None)), Tree(12, None, None)), Tree(5, Tree(6, None, Tree(11, None, None)), None))
paths = list(tree.get_sums())
new_paths = [a for i, a in enumerate(paths) if a not in paths[:i]]
final_path = [i for i in paths if sum(i) == 15]
输出:
[[4, 5, 6]]
我认为您需要清楚地考虑信息是从树上(从根到叶)还是从树上(从叶到根)流动。看起来,
root\u to\u leaf\u helper
的node\u data
参数在树的顶部(根)初始化,然后通过递归调用向下传递到每个节点。那很好,但据我所知,它在下山的路上从未改变过。它只是原封不动地传递着。因此,对于node\u data.num\u found
,第一次检查将始终为false
更糟糕的是,由于node\u data
在向下树的过程中始终是相同的((0,False)
),下面的一行尝试将当前节点的值添加到运行总和:
new_running_sum = node.val + node_data.running_sum
将始终将node.val
添加到0,因为node\u数据。运行的\u sum
始终为0
希望这是清楚的,我意识到这有点难以解释
但是,如果能够非常清楚地思考沿树向下流动的信息(在递归调用的参数中)与沿树向上流动的信息(在递归调用的返回值中),则会使这一点更加清楚。谢谢!事实上,我在工作手册中找到了一个解决方案——更好奇的是,我的方法出了什么问题,以及将来要注意什么。
new_running_sum = node.val + node_data.running_sum