Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根到叶算法错误_Python_Algorithm_Recursion_Binary Tree - Fatal编程技术网

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