当前位置: 首页 > 知识库问答 >
问题:

为什么这个解决方案起作用?Leetcode#94

汪正雅
2023-03-14

对于python我是新手,我正在做leetcode问题94,二叉树顺序遍历。给定二叉树的根,返回对其节点值的inorder遍历。

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:return []
        res = []
        res+=self.inorderTraversal(root.left)
        res.append(root.val)
        res+=self.inorderTraversal(root.right)
        return res

但我还是不明白它为什么有用。在res.append(root.val)之后,在递归过程中,res变量不会被重新分配给[]吗res+=self.inordertraversal(root.right)?或者res变量在不同的递归中应该是不同的变量吗?

共有1个答案

锺英卫
2023-03-14

每个递归调用分配自己的本地res变量并返回它。最外层(第一个)res是通过组装(追加)内部/(更深层次)子问题的结果来构建的。

然而,我想指出的是,原始程序混合了遍历树和创建列表的问题。下面是inorder的一个实现,它只关注遍历-

def inorder(node):
  if not node: return
  yield from inorder(node.left)
  yield node.val
  yield from inorder(node.right)

要从iterable likeInOrder获取列表,我们使用list构造函数-

list(inorder(some_tree))
# => [ ... ]

关注点分离是成功程序员使用的基本技术。它使设计/编写函数变得更加容易,并促进代码重用。对于这个程序,这意味着你不仅仅局限于创建列表;在遍历树时,您可以执行任何操作,如搜索、创建新树、打印到stdout、写入文件或发出网络请求。

s = 0
for val in inorder(some_tree):
  print(f"node value: {val}")
  s += val
print(f"tree sum: {s}")

中包装所有内容来自Java和C#等语言,但在Python中没有任何好处。原始程序不是由一个流利的Python扬声器编写的另一个指示是使用了CamelCase而不是snake_case-

class solution:
  def inorder_traversal(self, root):
    return list(inorder(root))
 类似资料:
  • 下面的代码是我解决这个问题的尝试。我使用了基于1的索引。我无法找出错误。我试着调试代码,但没有帮助。我已经被困了两天了。请帮忙。

  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 以下是对不熟悉此问题的人的问题声明: 给定一个二维板和一个单词,找出这个单词是否存在于网格中。这个词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格不能使用不止一次。 解决方案2 现在,据我所知,随着Java的短路,的两个版本都应该停止探索其他路径,如果任何子问题返回true。事实上,我可以评估的两个版本之间唯一的操作差异是,如果找到解决方案,第一个

  • 我正在努力解决Leetcode问题489。机器人房间清洁器使用回溯。具体来说,我尝试在四个方向中的每一个方向移动机器人,如果四个方向都被阻塞或清理,则返回。 下面的代码不起作用,我正试图用这个简单的示例对其进行调试: 其中1表示机器人可以访问单元,0表示单元被阻止。机器人从这个初始位置开始: 在我运行代码后,机器人只清洁了网格的右侧部分(c-清洁,d-左脏): 它似乎正确地返回到单元格[0,1],

  • 给定一个二维板和一个单词,找出这个单词是否存在于网格中。 这个词可以由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格不能使用不止一次。 例如,给定 这是典型的DFS+回溯解决方案。它将与进行比较。如果它们匹配,则将更改为以将其标记为已访问。然后移动到下一个(即)并将其与当前邻居进行比较(通过递归进行)。 下面是我的代码,这是不工作。我试着调试,但我觉得在

  • 我是这里的初学者,这个代码在理论上应该是可行的,为你们这些很棒的家伙们帮我干杯! 13195的质因数是5、7、13、29。 600851475143的最大质因数是什么? 欧拉问题3