2013-08-21 2 views
0

Существует пример бинарного древовидного класса.Класс поиска двоичного дерева

Сначала я определяю дерево классов.

>>> class Tree(object): 
>>>  def __init__(self, data=None, left=None, right=None): 
>>>   self.data = data 
>>>   self.left = left 
>>>   self.right = right 
>>>  def inorder(self): 
>>>   if self.left: 
>>>    for x in self.left.inorder(): 
>>>     yield x 
>>>    yield self 
>>>   if self.right: 
>>>    for x in self.right.inorder(): 
>>>     yield x 
>>>  def __iter__(self): 
>>>   return self.inorder() 
>>>  def __repr__(self, level=0, indent="  "): 
>>>   s = level*indent + `self.data` 
>>>   if self.left: 
>>>    s = s + "\n" + self.left.__repr__(level+1, indent) # *** Right this point *** 
>>>   if self.right: 
>>>    s = s + "\n" + self.right.__repr__(level+1, indent) 
>>>   return s 

А затем определит функцию "дерево"

>>> def tree(List): 
>>>  n = len(List) 
>>>  if n == 0: 
>>>   return None 
>>>  i = n/2 
>>>  return Tree(List[i], tree(List[:i]), tree(List[i+1:])) 

Наконец печать бинарного дерева

>>> t = tree('abcdef') 
>>> print t 

И результат выходит, как показано ниже.

'd' 
    'b' 
      'a' 
      'c' 
    'f' 
      'e' 

И вопрос, почему не вставляя «себя» в предст метод, где я указать.

self.left является экземпляром, чтобы можно было не поставить «я» в _ repr _method?

заранее спасибо :)

ответ

1

self.left является другой экземпляр Tree класса.

Каждый элемент в дереве имеет два узла «ребенок», self.left и self.right и __repr__ лишь делегирует печать этих узлов непосредственно к узлам самостоятельно, с настраиваемым отступа.

Обычно, вы назвали бы repr(self.left) и Python в свою очередь, будет вызывать self.left.__repr__(), но это не дает вам возможность прохождения уровня отступа; поэтому этот код вызывает вместо этого self.left.__repr__().

Смежные вопросы