Бинарное дерево в Python


Как Python новичок, я закодированы это двоичное дерево, насколько я мог бы следовать питона идиом. Однако, я знаю, это все еще очень многословен и не до стандарта. Я хотел бы, чтобы специалисты Python, чтобы разорвать этот друг от друга и выявить его слабые места.

class TreeNode(object):
  """ applicable to all tree nodes including root node """
  def __init__(self, value, left=None, right=None,root=False):
    self.value = value 
    TreeNode.check(left)
    TreeNode.check(right)
    self.left = left
    self.right = right
    self.root = root

  def inorder(self):
    s = list()
    if not self.left:
      s.append('')  
    else:
      s.append(self.left.inorder())

    s.append(str(self.value))

    if not self.right:
      s.append('')
    else:
      s.append(self.right.inorder())

    return ' '.join(s).strip()

  # returns True if success, False otherwise  
  def insert( self, new_value ):
    # TODO ?? what happens if we are inserting strings
    if not new_value and new_value != 0:
      return False

    if new_value == self.value:
      return False

    # need to find the right location in terms of binary tree ordering
    if new_value < self.value:
      if not self.left:
        self.left = TreeNode(new_value) 
        return True
      else:
        return self.left.insert( new_value )
    elif new_value > self.value:
      if not self.right:
        self.right = TreeNode(new_value)
        return True
      return self.right.insert( new_value )

    return False

  @staticmethod    
  def check(node):
    if not node:
      return
    if not isinstance(node, TreeNode):
      raise TypeError('only instances of TreeNode are allowed')      

  def __repr__(self):
    return '(' + repr(self.left) + ',' + \
      str(self.value) + ',' + repr(self.right) + ')'


Комментарии
1 ответ

Во-первых, официальное руководство по стилю Python рекомендует 4-пространства отступа, а вы через 2. (Ничего страшного, но после гид по стилю-это полезно)

class TreeNode(object):
""" applicable to all tree nodes including root node """
def __init__(self, value, left=None, right=None,root=False):

Ваш код не передает левый/правый параметр. Там также, кажется, не хорошая причина, почему вы бы пройти влево/вправо параметров в строительстве из дерева. Я предполагаю, что вы бы использовать этот класс, создав пустое дерево и вставка значения в нее, не сочинив деревьев. В результате, я предлагаю ликвидировать влево/вправо.

Кроме того, у вас есть параметр root, который никогда не используется. Похоже на то, что надо устранить.

Кроме того, вы не можете создать пустое дерево с помощью этого метода.

    self.value = value 
TreeNode.check(left)
TreeNode.check(right)
self.left = left
self.right = right
self.root = root

def inorder(self):
s = list()

Использовать S = [], а также не использовать одну переменную буквой фамилии.

    if not self.left:

При проверке на нет, рекоммендую практика-делать это так: если самостоятельно.слева-нет:

      s.append('')  
else:
s.append(self.left.inorder())

s.append(str(self.value))

if not self.right:
s.append('')
else:
s.append(self.right.inorder())

return ' '.join(s).strip()

Тот факт, что вы пытаетесь построить строку, немного странно. Я ожидал, что это способ получения либо итератор или список, содержащий все элементы.

  # returns True if success, False otherwise  
def insert( self, new_value ):
# TODO ?? what happens if we are inserting strings
if not new_value and new_value != 0:
return False

Вот почему вы должны "нет"

    if new_value == self.value:
return False

# need to find the right location in terms of binary tree ordering
if new_value < self.value:
if not self.left:
self.left = TreeNode(new_value)
return True
else:
return self.left.insert( new_value )
elif new_value > self.value:

Вы уже установили, что это выражение должно быть истинным, просто использовать еще

      if not self.right:
self.right = TreeNode(new_value)
return True
return self.right.insert( new_value )

Предыдущая ветка была эта внутри другого. Вы должны по крайней мере быть согласованы между филиалами

    return False

@staticmethod
def check(node):
if not node:
return
if not isinstance(node, TreeNode):
raise TypeError('only instances of TreeNode are allowed')

Явной проверки типов с неодобрением. Все вы управлять преобразования AttributeError в исключение TypeError. Однако метод проверки целесообразно проверить инварианты структуры данных. (Только делать это во время отладки).

  def __repr__(self):
return '(' + repr(self.left) + ',' + \
str(self.value) + ',' + repr(self.right) + ')'

Treenode, которая, кажется, класс коллекции, который содержит элементы. Внутреннее строение не должно иметь значения для мира. Однако, предст разливов внутреннюю структуру для мира, чтобы видеть. Я предлагаю называть inorder, чтобы производить все элементы внутри строки и показать, что. Также Значение предст должны сделать это ясно, что класс предстою, включая "карты" где-то в его выходной.

6
ответ дан 6 мая 2011 в 12:05 Источник Поделиться