2017-01-31 3 views
0
class Node: 
    def __init__(self, v): 
     self.l = None 
     self.r = None 
     self.v = v 

class BinaryTree: 
    def __init__(self): 
     self.root = None 

    def put(self, v): 
     if self.root is None: 
      self.root = Node(v) 
     else: 
      if self.root is None: 
       self.root = Node(v) 
      elif self.root.v <= v: 
       self.root.r = self.put(self.root.r, v) 
      elif self.root.v > v: 
       self.root.l = self.put(self.root.l, v) 
     return self.root 

    def __contains__(self, v): 
     return finns(self.root, v) 

    def write(self): 
     if self.root is not None: 
      print(self.root.v) 
      if self.root.l is not None: 
       self.write(self.root.l) 
      if self.root.r is not None: 
       self.write(self.root.r) 

a = BinaryTree() 
a.put(3) 
a.put(4) 
a.write() 

Интересно, почему это не работает. Он говорит:Проблемы с внедрением двоичного дерева

TypeError: put() takes 2 positional arguments but 3 were given 

Я просто хочу, чтобы использовать put() для ввода чисел в дереве.

(Примечание: «V» означает значение «R» для правой и «L» для левой.).

+3

Вы называете 'self.put' с двумя аргументами' 'self.root.r' и V'. Это слишком много аргументов. – chepner

+0

Удалите 'self' перед' put', чтобы вызвать его из другого объекта. –

+0

Вы пишете 'self.put (self.root.r, v)'. Здесь вы пишете два параметра явно (а третий - 'self'). Но ваш 'put' ожидает только два (неявно) и один (явно). –

ответ

0

Ты получил TypeError, потому что вы используете put(). Однако реальная проблема заключается в том, что вы не строите дерево должным образом.

В приведенном ниже коде проблема устранена плюс я также исправил методы write()__contains__(), оба из которых также были.

class Node: 
    def __init__(self, v): 
     self.l = None 
     self.r = None 
     self.v = v 

class BinaryTree: 
    def __init__(self): 
     self.root = None 

    def put(self, v): 
     if self.root: 
      self._put(v, self.root) 
     else: 
      self.root = Node(v) 

    def _put(self, v, node): 
     if v < node.v: 
      if node.l: 
       self._put(v, node.l) 
      else: 
       node.l = Node(v) 
     else: 
      if node.r: 
       self._put(v, node.r) 
      else: 
       node.r = Node(v) 

    def __contains__(self, v): 
     return (False if not self.root 
        else self._find(v, self.root) is not None) 

    def _find(self, v, node): 
     if v == node.v: 
      return node 
     elif v < node.v and node.l is not None: 
      return self._find(v, node.l) 
     elif v > node.v and node.r is not None: 
      return self._find(v, node.r) 

    def write(self): 
     if self.root is not None: 
      self._write(self.root, 0) 

    def _write(self, node, level): 
     if node is not None: 
      self._write(node.l, level+1) 
      print(' '*level + str(node.v)) 
      self._write(node.r, level+1) 

a = BinaryTree() 
a.put(3) 
a.put(4) 
a.put(5) 
a.put(9) 
a.put(7) 
a.put(10) 
a.write() 
print('') 
print('{:2} in "a" -> {}'.format(5, 5 in a)) 
print('{:2} in "a" -> {}'.format(42, 42 in a)) 

Выход:

3 
    4 
    5 
     7 
     9 
     10 

5 in "a" -> True 
42 in "a" -> False 
+0

Да, я вижу изменения. Узлы не связаны друг с другом, чтобы сформировать дерево, как только я помещу больше целых чисел, они заменяют друг друга, а не добавляют к дереву. Не могли бы вы сослаться на исследование Python, которое поможет мне исправить эту проблему? И спасибо! – Alwe17

+0

При попытке добавить узел с тем же значением, что и существующий, он заменит его. Это связано с тем, что 'if self.root.v <= v:' будет 'True', когда сравниваются два значения. Кроме этого, я не уверен, что вы имеете в виду, что они не добавляют к дереву. Я не знаю каких-либо специфических для Python ресурсов, но тема бинарных деревьев широко написана, о которых я уверен, что вы можете найти себя - они должны оказаться полезными, даже если содержащиеся в них примеры написаны на другом компьютерном языке. – martineau

+0

Okey Sir, я попытаюсь объяснить себя. В приведенном выше коде мы можем положить 2 целых числа, и алгоритм будет разделять их на значения на каждом углу дерева. Когда мы добавляем больше целых чисел, они заменяют друг друга только слева или справа, когда наш ввод больше или меньше, чем мы ставим в начале. Вы можете попробовать это, например, при добавлении: 'a.put (5)' 'a.put (9)' 'a.put (10)' 'a.put (1)' Когда вы запустите код, algo напечатает: Он заменил 4 в левом углу на ---> 1, а справа он добавил 10. Я хотел создать его как дерево со всеми входами – Alwe17

0

В строке self.root.r = self.put(self.root.r, v) вы вызовите метод put с двумя явными аргументами. Поскольку вы вызываете метод на self, метод привязан и self передается неявно в качестве первого аргумента (всего три аргумента).

Ваш код в настоящее время не имеет достаточного смысла для меня, чтобы предложить легкое исправление. Например, вы можете передать экземпляр явно BinaryTree.put, но в настоящее время вы пытаетесь передать экземпляр Node не BinaryTree.

+0

Да, я думаю, я это вижу. Я пытаюсь связать узлы togehter сейчас. Спасибо за помощь. – Alwe17

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