Python 退货问题

Python 退货问题,python,algorithm,recursion,binary-tree,Python,Algorithm,Recursion,Binary Tree,我正在尝试实现一个函数,它获取两个根节点(二叉树),遍历并检查它们是否相同。我是如何走到这一步的 def inorder(p, q): if p and q: inorder(p.left, q.left) if p.val != q.val: return False inorder(p.right, q.right) return True 即使我在函数中添加了一些打印,我可以看到p.val显然不等于q.val,它仍然返回True。我想不出来

我正在尝试实现一个函数,它获取两个根节点(二叉树),遍历并检查它们是否相同。我是如何走到这一步的

def inorder(p, q):
  if p and q:
    inorder(p.left, q.left)
    if p.val != q.val:
      return False
    inorder(p.right, q.right)
    return True

即使我在函数中添加了一些打印,我可以看到p.val显然不等于q.val,它仍然返回True。我想不出来。是否因为递归堆栈调用而返回两次?

您的代码没有检查子级的顺序调用的结果。如果
p
q
具有相同的根值,则始终会返回
True
,即使
按顺序(p.left,q.left)
返回
False
。下面是更正的代码:

def inorder(p, q):
    if p is None and q is None:
        return True
    elif p is not None and q is not None:
        return (
            p.val == q.val 
            and inorder(p.left, q.left)
            and inorder(p.right, q.right)
        )

您的代码没有检查子级调用的顺序
的结果。如果
p
q
具有相同的根值,则始终会返回
True
,即使
按顺序(p.left,q.left)
返回
False
。下面是更正的代码:

def inorder(p, q):
    if p is None and q is None:
        return True
    elif p is not None and q is not None:
        return (
            p.val == q.val 
            and inorder(p.left, q.left)
            and inorder(p.right, q.right)
        )

如果inoorder()返回False,并且如果p或q中只有一个存在,则必须停止,否则返回False

def inorder(p, q):
  if p and q:
    if not inorder(p.left, q.left):
      return False
    if p.val != q.val:
      return False
    return inorder(p.right, q.right)
  return not p and not q

如果inoorder()返回False,并且如果p或q中只有一个存在,则必须停止,否则返回False

def inorder(p, q):
  if p and q:
    if not inorder(p.left, q.left):
      return False
    if p.val != q.val:
      return False
    return inorder(p.right, q.right)
  return not p and not q


递归调用的意义是什么?你对它们返回的值不做任何处理。@jornsharpe p.val,q.val相等性检查怎么样?是的,确实如此,但是您将看到递归调用的结果,这些结果在顶级调用的返回中没有使用。@jornsharpe说实话,我想简单一点,并说如果我要检查两个二叉树的相等性,我认为以相同的方式遍历它们会有所帮助。A我还认为使用递归调用可以更快地完成遍历。@阿里在这里使用递归没有错,但是,您最好检查子树调用的结果。递归调用有什么意义?你对它们返回的值不做任何处理。@jornsharpe p.val,q.val相等性检查怎么样?是的,确实如此,但是您将看到递归调用的结果,这些结果在顶级调用的返回中没有使用。@jornsharpe说实话,我想简单一点,并说如果我要检查两个二叉树的相等性,我认为以相同的方式遍历它们会有所帮助。a我还认为使用递归调用可以更快地完成遍历。@阿里在这里使用递归没有错,但是,您最好检查子树调用的结果。尽管这看起来是一个完美的答案,但很抱歉我不能理解。你能给我一点解释吗?有没有任何可能的情况,p是无的,q不是无的?是的。设想树
p
是一个节点(仅根节点)树,而
q
有两个子节点。然后,
inoder(p.left,q.left)
调用将在p为None,q为None的情况下进行。然后这个函数返回None?是的,
None
的布尔值为
False
,所以一切都正常。尽管这看起来像是一个完美的答案,但很抱歉我无法理解。你能给我一点解释吗?有没有任何可能的情况,p是无的,q不是无的?是的。设想树
p
是一个节点(仅根节点)树,而
q
有两个子节点。然后,
inoder(p.left,q.left)
调用将在p为None,q为None的情况下进行。然后此函数返回None?是的,
None
的布尔值为
False
,因此一切正常。非常感谢您的回答。非常感谢您的回答。