[英]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.