繁体   English   中英

Python中的有序遍历

[英]InOrder Traversal in Python

我要解决的问题是在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无法通过该节点?

当您递归调用自己时,如下所示:

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反正。)

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

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)

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

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)

关于迭代器的教程部分以及关于生成的以下部分说明了大多数工作原理。 唯一缺少的一点是对yield from的解释,这在PEP 380中进行了解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM