我想詢問Python中一個作為類變數的物件的范圍。
import numpy as np
class treeNode。
def __init__(self,key):
self.leftChild = None.
self.rightChild = None: self.rightChild = None.
self.value = key
def insert(root,key)。
if root is None:
return treeNode(key)
else:
if root.value == key:
return root
elif root.value<key:
root.rightChild = insert(root.rightChild,key)
else:
root.leftChild = insert(root.leftChild,key)
return root
def insert_1(root,key)。
if root is None:
root = treeNode(key)
else:
if root.value<key:
insert_1(root.rightChild,key)
elif root.value>key:
insert_1(root.leftChild,key)
def construct_tree(a)。
def insert_1(root,key)。
if root is None:
root = treeNode(key)
else:
if root.value<key:
insert_1(root.rightChild,key)
elif root.value>key:
insert_1(root.leftChild,key)
root = treeNode(a[0] )
for k in a:
insert_1(root,k)
return root
if __name__ == '__main__'/span>:
np.random.seed(1)
a = np.random.rand(12)
tree = treeNode(a[0] )
for k in a:
insert(tree,k)
for k in a:
insert_1(tree,k)
tree_1 = construct_tree(a)
insert()函式產生了整個樹,而insert_1()和construct_tree()沒有回傳任何東西,卻未能這樣做。是否有一個函式可以在不使用return陳述句的情況下遞回構建整個樹?非常感謝。
uj5u.com熱心網友回復:
在insert中,遞回的基本情況是當你插入到一個空的子樹,由None作為root傳入代表。它之所以起作用是因為你可以在這種情況下創建并回傳一個新的treeNode,并且呼叫者將對回傳值做正確的處理。
如果你不想使用return,你需要把這個基本情況推給呼叫代碼,這樣它就可以避免在一個葉子節點將要被添加時進行呼叫:
def insert_no_return(root, key)。
assert(root != None) # 我們不能處理空樹。
if root.key == key:
return # no value here, just quit early[/span].
elif root.key < key:
if root.rightChild is None: #新的基本情況。
root.rightChild = treeNode(key)
else:
insert_no_return(root.rightChild, key) # regular recursive case, with no assignment.
elif root.key > key:
if root.leftChild is None: # 另一個孩子的新基例: # 新基例
root.leftChild = treeNode(key)
else:
insert_no_return(root.leftChild, key) # 這里也沒有賦值。
這比帶有return的版本要重復一些,因為基例需要對每個可能的新子代進行重復,但是遞回行要短一些,因為它們不需要在任何地方賦值。
正如頂部的斷言所說,你不能在一個空樹(用None表示)上有效地呼叫它,因為它沒有辦法改變你對None根的現有參考。所以construct_tree可能需要特殊的邏輯來構建空樹。你當前版本的該函式完全沒有處理空的輸入(并且多余地嘗試將根值添加到樹中):
def construct_tree(a)。
if len(a) == 0: # special case to construct an empty tree.
return None
it = iter(a) # 使用迭代器以避免重復插入a[0]。
root = treeNode(next(it))
for k in it:
insert_no_return(root, k)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/328114.html
標籤:
