2017-01-31 8 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()を使用します。あなたは2つの明示的な引数を持つインスタンスメソッドを呼び出すputself.root.r = self.put(self.root.r, v)ラインで

+3

次の2つの引数、 'self.root.r'と' v'と 'self.put'呼び出します。それはあまりにも多くの議論です。 – chepner

+0

'put'の前に' self'を削除して、別のオブジェクトから呼び出せます。 –

+0

'self.put(self.root.r、v)'と記述します。ここでは2つのパラメータを明示的に入力します(3つ目は 'self'です)。しかし、あなたの 'put'は2つ(暗黙的に)と1つ(明示的に)しか期待していません。 –

答えて

0

put()を間違って使用しているため、TypeErrorが届いています。しかし、本当の問題は、ツリーを適切に構築していないことです。

以下のコードでは、この問題は修正されていますが、私は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:'は2つの値が比較されるとき '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

(「V」は値の略で、「R」、左右のための「L」のために注意してください。)。 selfでメソッドを呼び出すので、メソッドがバインドされ、selfが暗黙的に最初の引数として渡されます(合計3つの引数)。

現在のところ、あなたのコードでは、簡単に修正することはできません。たとえば、インスタンスをBinaryTree.putに明示的に渡すことはできますが、現在はNodeではなくBinaryTreeのインスタンスを渡そうとしています。

+0

さて、私はそれを見ると思います。私はノードを今すぐにリンクしようとしています。助けてくれてありがとう。 – Alwe17

関連する問題