【问题标题】:InOrder Traversal in PythonPython中的中序遍历
【发布时间】:2014-02-06 04:40:15
【问题描述】:

我要解决的问题是在 BST 的中序遍历中找到第一个出现的节点。 我的代码如下所示

def Inorder_search_recursive(node,key):
    if not node:
        return None
    InOrder_search_recursive(node.lChild)
    if node.value==key:
        return node
    InOrder_search_recursive(node.rChild)

这段代码总是返回 None,这有什么问题。当我找到一个值为 k 的节点时,我想我已经返回了节点。为什么python不能通过这个节点???提前谢谢

【问题讨论】:

  • 如果这是一棵二叉搜索树,那么使用实际的二叉搜索而不是顺序搜索可能会得到更好的结果。
  • 是的,你是对的,我刚刚想通了,我们可以先用 value 键定位那个值。我们可以使用 BST 的属性来节省大量时间。然后搜索它的左子树。如果它的左子树也有一个带有 value 键的节点,则立即返回。

标签: python recursion data-structures binary-search-tree inorder


【解决方案1】:

当你递归调用自己时,像这样:

InOrder_search_recursive(node.lChild)

这只是一个普通的函数调用,就像其他任何函数一样。它只是调用函数并返回结果。它不会自动 return 来自该函数的值,或执行其他任何操作。

所以,你做左子树搜索,忽略结果,然后继续检查node.value == key,如果失败,你做右子树搜索,再次忽略结果,然后掉到最后函数,意味着你返回None

要完成这项工作,您需要 return 您返回的值。但是,当然,前提是它是not None

另外,您忘记将key 参数传递给递归调用,因此您只会得到TypeError。 (我猜你的真实代码没有这个问题,但由于你没有向我们展示你的真实代码或工作示例,我不能确定......)

所以:

def Inorder_search_recursive(node, key):
    if not node:
        return None
    result = InOrder_search_recursive(node.lChild, key)
    if result is not None:
        return result
    if node.value==key:
        return node
    return InOrder_search_recursive(node.rChild, key)

(您不需要 not None 检查右侧搜索,因为如果它返回 None,我们就没有其他尝试了,无论如何都会返回 None。)

【讨论】:

    【解决方案2】:

    我的另一个答案给出了对新手友好的解决方案,但如果您想要更强大和简洁的答案:

    def Inorder_search_recursive_all(node, key):
        if not node:
            return
        yield from InOrder_search_recursive(node.lChild, key)
        if node.value==key:
            yield node
        yield from InOrder_search_recursive(node.rChild, key)
    

    这会按顺序在树中生成 所有 个匹配项。并且它将它们作为迭代器提供给您,因此如果您只想要第一个,您可以在找到一个后立即停止,而不会浪费工作:

    def Inorder_search_recursive(node, key):
        return next(Inorder_search_recursive_all(node, key), None)
    

    Iterators 的教程部分和生成器的以下部分解释了它的大部分工作原理。唯一缺少的一点是对yield from的解释,在PEP 380中有解释。

    【讨论】:

      【解决方案3】:

      由于您的问题是to find the first occurrence node in its inorder traversal,因此您应该 1) 按顺序遍历树并 2) 在找到第一个匹配项时停止。

      def search(node, key):
          if node is None:
              return None
          # Search the left subtree and return early if key is found
          n = search(node.lChild, key)
          if n is not None:
              return n
          # Check middle and return early if key is found
          if node.value == key:
              return node
          # Search right subtree
          return search(node.rChild, key)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2018-08-10
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        相关资源
        最近更新 更多