表示python中的二叉搜索树

时间:2010-06-17 03:19:09

标签: python data-structures binary-tree binary-search-tree

我如何在python中表示二进制搜索树?

1 个答案:

答案 0 :(得分:12)

class Node(object):

  def __init__(self, payload):
    self.payload = payload
    self.left = self.right = 0

    # this concludes the "how to represent" asked in the question.  Once you
    # represent a BST tree like this, you can of course add a variety of
    # methods to modify it, "walk" over it, and so forth, such as:

  def insert(self, othernode):
    "Insert Node `othernode` under Node `self`."
    if self.payload <= othernode.payload:
      if self.left: self.left.insert(othernode)
      else: self.left = othernode
    else:
      if self.right: self.right.insert(othernode)
      else: self.right = othernode

  def inorderwalk(self):
    "Yield this Node and all under it in increasing-payload order."
    if self.left:
      for x in self.left.inorderwalk(): yield x
    yield self
    if self.right:
      for x in self.right.inorderwalk(): yield x

  def sillywalk(self):
    "Tiny, silly subset of `inorderwalk` functionality as requested."
    if self.left:
      self.left.sillywalk()
    print(self.payload)
    if self.right:
      self.right.sillywalk()

等等 - 基本上与使用引用而不是指针(如Java,C#等)的任何其他语言一样。

修改

当然,sillywalk的存在确实很愚蠢,因为完全相同的功能是walk方法之上的单线外部片段:

for x in tree.walk(): print(x.payload)

并且使用walk,您可以获得有序节点流上的任何其他功能,而使用sillywalk,您可以获得关于diddly-squat的信息。但是,嘿,OP说yield是“令人生畏的”(我想知道有多少Python 2.6的其他30个关键词在OP的判断中应该得到这样的恐吓? - )所以我希望print是不是!

这完全超出了实际问题,在代表 BST: 完全回答了__init__ - payload属性用于保存节点的有效负载,leftright属性以保存None(意思是,此节点在该侧没有后代)或Node(顶部适当方面的后代子树)。当然,BST约束是每个节点的每个左后代(如果有的话)的有效载荷小于或等于所讨论节点的有效载荷,每个右边一个(再次,如果有的话)具有更大的有效载荷 - 我添加了{ {1}}只是为了表明维持这种约束是多么微不足道,insert(现在是walk)显示了使所有节点按有效载荷递增的顺序是多么微不足道。同样,一般的想法与您在任何使用引用而不是指针的语言中表示 BST的方式完全相同,例如,C#和Java。