关于从递归函数返回正确的东西的问题(Leetcode 572)
Posted
技术标签:
【中文标题】关于从递归函数返回正确的东西的问题(Leetcode 572)【英文标题】:Question about returning the right thing from recursive function (Leetcode 572) 【发布时间】:2022-01-19 15:34:38 【问题描述】:我在做 Leet Code 题572. Subtree of Another Tree:
给定两个二叉树
root
和subRoot
的根,如果root
的子树具有相同的结构和节点值subRoot
和false
,则返回true
。否则。二叉树
tree
的子树是由tree
中的一个节点和该节点的所有后代组成的树。树tree
也可以被认为是它自己的子树。
我有一个可行的解决方案。但是,在尝试稍微不同的方法时,我的递归 dfs 函数遇到了问题。我的代码结构是这样的:
def isSubTree(self, root, subRoot):
def dfs(root, subRoot):
# some function that returns True when certain conditions are met
if not root: return
self.isSubtree(root.left, subRoot)
self.isSubtree(root.right, subRoot)
if root.val == subRoot.val:
if dfs(root, subRoot):
return True
return False
基本上,isSubTree
会探索树中的所有节点。一旦它找到一个与subRoot
具有相同值的节点,它将以该节点为根的子树与以subRoot
和dfs()
为根的子树进行比较。
我打算当dfs()
函数返回true 时,isSubTree()
也将返回true。如果我已经探索了树中的所有节点(isSubTree()
到达末尾)并且dfs()
没有返回 true
isSubTree()
将返回 False。
但是,我的代码似乎总是返回 false,因为它返回 False
的最后一行(我已经对其进行了测试,并且可以验证如果达到 dfs()
中的 return True
部分,我也很漂亮确定我的dfs()
函数是正确的)。
我的问题是,有没有一种优雅的方式让我的代码做我想做的事情?
【问题讨论】:
您的递归函数无效:它没有主体。缩进是否正确? 【参考方案1】:很难看出您正在使用哪个代码,因为很明显在def dfs
下方存在语法问题。缩进关闭或缺少代码(在撰写本文时)。
有这些问题:
任何一个递归 self.isSubTree
调用的返回值都没有被使用。这不可能是正确的,因为您肯定需要这些信息来得出有关已完成工作的任何信息。
if not root: return
在启动时不会返回布尔值。这应该区分subTree
也是None
的情况:在这种情况下,返回值应该是True
。否则应该是False
假设您未提供的dfs
代码是正确的,它也会很好地处理前一点(其中一个或两个参数是None
),并且会正确比较节点值,那么@ 987654330@ 不应该在之前被调用 dfs
,因为 dfs
会处理这个问题。
同样if root.val == subTree.val
不应该出现在它现在出现的地方,而只能出现在dfs
中。
最后,工作代码可能是这样的:
class Solution(object):
def isSubtree(self, root, subRoot):
def dfs(root, subRoot):
if not root or not subRoot or root.val != subRoot.val:
return root == subRoot # Must both be None to have success
return dfs(root.left, subRoot.left) and dfs(root.right, subRoot.right)
return dfs(root, subRoot) or root and (
self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
)
【讨论】:
哦,我只是在这里将 dfs 函数留空,但在我的实际实现中,它有代码。你可以忽略它。 我的回答怎么样。它回答了你的问题吗?【参考方案2】:通过以下方式解决:
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
def dfs(r1, r2):
# some function
if not root:
return False
if root.val == subRoot.val:
if dfs(root, subRoot):
return True
return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
【讨论】:
回答你自己的问题很好,但一个好的答案可以解释问题是什么。以上是关于关于从递归函数返回正确的东西的问题(Leetcode 572)的主要内容,如果未能解决你的问题,请参考以下文章