繁体   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