6

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

4

1 回答 1

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,您可以获得几乎没有的下蹲。但是,嘿,OP 说yield是“令人生畏的”(我想知道 Python 2.6 的其他 30 个关键字中有多少值得在 OP 的判断中使用这种吓人的话?-)所以我希望print不是!

这完全超出了代表BST 的实际问题:问题完全在__init__-payload保存节点有效负载的属性leftright保存None(意味着该节点在该侧没有后代)或Node(适当一侧的后代子树的顶部)。当然,BST 约束是每个节点的每个左后代(如果有)的有效载荷小于或等于所讨论节点的有效载荷,每个右后代(同样,如果有的话)都有更大的有效载荷——我只是添加insert了展示维持该约束是多么微不足道,walk(现在sillywalk) 来展示让所有节点按有效负载的递增顺序获取是多么微不足道。同样,总体思路与您在任何使用引用而不是指针的语言(例如 C# 和 Java)中表示BST 的方式相同。

于 2010-06-17T03:26:50.073 回答