簡體   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