[英]How to build a binary search tree with python without pointers?
我已經看到了“如何構建二叉樹”這一問題的一些答案,但相關答案似乎無法正常工作! 它們或多或少基於算法:
def insert(item, tree):
if (item < tree.entry):
if (tree.left != None):
insert(item, tree.left)
else:
tree.left = Tree(item)
else:
if (tree.right != None):
insert(item, tree.right)
else:
tree.right = Tree(item)
前面提到的代碼是由Isaac1000編寫的,但其他代碼非常相似。 問題是當tree.right或tree.left在以下調用中傳遞給函數“insert”時:
insert(item, tree.left)
insert(item, tree.right)
編寫代碼的人認為傳遞引用而不是值的副本,因此,tree.left或tree.right不會真正更改。 最后,該函數或類似函數只在樹的第一級或零級工作,但不在樹的n級工作。 那么,如何構建一個沒有指針的二叉搜索樹呢?
PS我說“沒有指針”只是因為我知道python沒有指針,但請告訴我,如果我錯了
@qfiard
“如果你將一個可變對象傳遞給一個方法,那么該方法會獲得對同一個對象的引用,你可以將它改變為你心中的喜悅,但是如果你在方法中重新引用引用,那么外部范圍將對它一無所知,並且完成后,外部引用仍將指向原始對象。“(Blay Conrad)
那次演講讓我很清楚。 我知道我的代碼沒有說話,因為我習慣了重新綁定tree.left。 以下代碼是我一直使用的代碼:
def insert(self, data):
if self is None:
self = Tree(data)
else:
if data < self.data:
Link.insert(self.left, data)
else:
Link.insert(self.right, data)
最后,當我寫self = Tree(data)
我試圖重新綁定一個對象,而外部范圍對它一無所知。 相反,使用我發布的過程,當我使用self.right或self.left時,我嘗試修改對象而不重新綁定,以便外部范圍記住我的更改。
Python中的參數通過賦值傳遞,類似於通過引用為可變類型(列表,對象,...)傳遞參數。 有關該主題的更多詳細信息,請參閱此stackoverflow答案: https : //stackoverflow.com/a/986145/2887956 。
如果您使用對象來表示樹,則您提供的代碼非常有效。 以下代碼輸出
<<None, 0, None>, 1, <None, 2, None>>
class Tree(object):
def __init__(self, entry):
self.entry = entry
self.left = None
self.right = None
def __str__(self):
return '<%s, %d, %s>' % (self.left, self.entry, self.right)
def insert(item, tree):
if item < tree.entry:
if tree.left is not None:
insert(item, tree.left)
else:
tree.left = Tree(item)
else:
if tree.right is not None:
insert(item, tree.right)
else:
tree.right = Tree(item)
root = Tree(1)
insert(0, root)
insert(2, root)
print root
如果您使用列表來表示樹,您的算法也會起作用,盡管您需要對其進行大幅修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.