簡體   English   中英

如何使用沒有指針的python構建二叉搜索樹?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM