关于从递归函数返回正确的东西的问题(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:

给定两个二叉树rootsubRoot 的根,如果root 的子树具有相同的结构和节点值subRootfalse,则返回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 具有相同值的节点,它将以该节点为根的子树与以subRootdfs() 为根的子树进行比较。

我打算当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)的主要内容,如果未能解决你的问题,请参考以下文章

在递归二叉树函数中返回元组时遇到问题

递归函数如何返回一些东西?

为啥这个递归函数返回正确的值? [复制]

Swift 在递归函数中没有返回正确的值

小白有一个关于python递归的问题 求教

关于java中的递归