【问题标题】:python - How to use in order traverse to compare treespython - 如何使用顺序遍历比较树
【发布时间】:2018-12-27 08:31:45
【问题描述】:

问题要求使用顺序遍历检查树qp 是否相同。我的逻辑是:

  1. 在检查 p 和 q 的左右时,如果 q 有左/右孩子但 p 没有,则返回 False

  2. 检查p和q的值时,如果不相同则返回False

我在示例中找到:(BFS 订单)

p = [1,2,3,5,6]

q = [1,2,3,4,6]

它发现了差异,但仍然返回 True。我有点理解这是因为它只在递归中调用inOrderTraverse(),所以return 命令不会停止递归运行。我尝试在递归部分之前添加return,使其变为return inOrderTraverse()。但是,在这种情况下,一旦访问了所有剩余的孩子,递归就会停止。

所以我真的不知道我还能做些什么改变来让这件事发挥作用。请帮忙,谢谢!

def inOrderTraverse(p, q):

     if p.left:
         if q.left and p.left.val == q.left.val:
             inOrderTraverse(p.left, q.left)
         else:
             return False

     if p.val != q.val:
         return False

     if p.right:
         if q.right and p.right.val == q.right.val:
             inOrderTraverse(p.right, q.right)
         else:
             return False

     return True

【问题讨论】:

  • 请修正缩进。忽略这一点在任何语言中都是不好的形式,但在 Python 中是不可原谅的。此外,您应该为树添加实际测试用例,而不仅仅是以列表形式描述它们。
  • 您忽略了递归调用的返回值。
  • 您需要在递归调用结果上使用 return 语句,否则您只是将它们扔掉并通过直通返回 True

标签: python recursion


【解决方案1】:

除了忽略对inOrderTraverse() 的递归调用的返回值,如 cmets 中所述,您似乎错过了q.left 存在但p.left 不存在的情况(同上)。这是我为解决这两个问题而对您的代码进行的修改:

def inOrderTraverse(p, q):

    if p.left or q.left:
        if p.left and q.left:
            if not inOrderTraverse(p.left, q.left):
                return False  # sub trees don't match
        else:
            return False  # only one has left

    if p.val != q.val:
        return False  # vals don't match

    if p.right or q.right:
        if p.right and q.right:
            if not inOrderTraverse(p.right, q.right):
                return False  # sub trees don't match
        else:
            return False  # only one has right

    return True  # everything matches

【讨论】:

    【解决方案2】:

    除了返回递归值,逻辑还可以简化一点:

    def areEqual(p, q):
    
      return bool(p) == bool(q) and (p is None or areEqual(p.left, q.left) and p.val == q.val and areEqual(p.right, q.right))
    

    【讨论】:

    • 流畅的实现(+1)
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多