【问题标题】:recursion in traversing a binary tree遍历二叉树的递归
【发布时间】:2019-08-23 04:58:56
【问题描述】:

我正在尝试解决 leetcode 问题 #113,即“给定一个二叉树和一个总和,找到所有从根到叶的路径,其中每个路径的总和等于给定总和”

我的问题是为什么下面显示的代码 #1 会打印树中所有节点的值?递归堆栈在代码 #1 中的工作方式与递归堆栈在代码 #2 中的工作方式相反,这是正确的解决方案?

非常感谢您对我的帮助!

#code #1
class Solution:
    def pathSum (self, root, sum):
        self.res = []
        self.dfs(root, sum, [])
        return self.res
    def dfs(self, root, sum, path):
        if not root:
            return 
        sum -= root.val
        path += [root.val]
        if not root.left and not root.right and sum == 0:
            self.res.append(path)
        self.dfs(root.left, sum, path)
        self.dfs(root.right, sum, path)
#code #2
class Solution:
    def pathSum (self, root, sum):
        self.res = []
        self.dfs (root, sum, [])
        return self.res 
    def dfs (self, root, sum, path):
        if not root:
            return 
        sum -= root.val
        if not root.left and not root.right and sum == 0:
            self.res.append(path + [root.val])
        self.dfs(root.left, sum, path+[root.val])
        self.dfs(root.right, sum, path+[root.val])

【问题讨论】:

  • 这个问题似乎是开放式的,而且相当不精确。写下一些例子并在上面测试你的代码。它应该让你对你的代码到底在做什么有一些看法。
  • @fulaphex 您好,感谢您对这个问题的关注!我很乐意写下一些例子并在上面测试我的代码。但问题是我不确定递归堆栈是如何与这段代码一起工作的,所以我无法测试它。
  • 我可以建议两种方法: 1. 在一张纸上写下一些示例树并分析纸上的代码。 2. 为节点实现缺失的类,写下示例树并使用调试器或一些调试打印语句分析程序。

标签: python python-3.x python-2.7 recursion


【解决方案1】:

嗯,上面的 cmets 是当之无愧的,一些例子在这里会有所帮助。例如,您谈论打印,但这里没有打印语句,那么您是如何驱动它的,您是如何使用它的?

话虽如此,我怀疑问题会追溯到代码#1 更改路径的值,而代码#2 没有。现在,如果 path 是一个数字,这无关紧要,因为它将按值传递。但是,您最初传入了 [] (一个空列表),它是一个 object 。 . .所以它是通过引用传入的。结果,随着代码 #1 的继续,您不断更改您上方的节点(路径),但在代码 #2 中,传入的路径永远不会改变。

【讨论】:

  • 我想调用/记住 python 是“按对象调用”。见jeffknupp.com/blog/2012/11/13/…。这个path+[root.val] 创建了一个新对象。
  • 点了。在我的第 10 种语言之后,我有时会在我的演讲中马虎。甚至不要让我开始讨论 UNDEF、NUL、NULL、None 和 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2016-05-01
  • 1970-01-01
  • 2010-11-20
  • 2021-07-26
相关资源
最近更新 更多