2017-08-07 10 views
1

これはPythonでBSTを作成するためのコードですが、すべて機能しますが、高さ関数にアクセスすると "AttributeError: 'NoneType'属性の高さは、「私は任意のヘルプは、あなたのツリーのリーフノードの場合AttributeError: 'NoneType'オブジェクトにはBST pythonsの高さがありません

class Node: 
     def __init__(self, data): 
      self.left = None 
      self.right = None 
      self.data = data 
     def insert(self, data): 
      if self.data: 
       if data < self.data: 
        if self.left is None: 
         self.left = Node(data) 
        else: 
         self.left.insert(data) 
       elif data > self.data: 
        if self.right is None: 
         self.right = Node(data) 
        else: 
         self.right.insert(data) 
      else: 
       self.data = data 

     def print_tree(self): 

      if self.left: 
       self.left.print_tree() 
      print (self.data) 
      if self.right: 
       self.right.print_tree() 

     def height(self): 
      if self.data is None: 
       return 0 
      else: 
       return 1 + max(self.left.height(),self.right.height()) 

    root = Node(8) 
    root.insert(3) 
    root.insert(10) 
    root.insert(1) 
    root.insert(6) 
    root.insert(4) 
    root.insert(7) 
    root.insert(14) 
    root.insert(13) 
    root.print_tree() 
    root.height() 
+0

リーフノードの場合、 'self.data'はNoneではありませんが、' self.left'と 'self.right'はNoneになります。 –

答えて

1

をにappriciatedされますpythonでデータ構造を作成するための新しいです、self.dataは、リーフノードの値に設定されますが、self.leftself.rightNoneだろう。しかし、それ以前であっても、左または右の子がNoneであるノードが存在する可能性があり、そのノードを試してその高さを取得するのでAttributeErrorNoneTypeになります。 heightのコードで

-

def height(self): 
    if self.data is None: 
     return 0 
    else: 
     return 1 + max(self.left.height(),self.right.height()) 

再帰がleft又はrightノードがNone、上記のコードは、それがself.left.height()又はself.right.height()にアクセスしようとするので失敗、および1つであろういずれかのノードに到達しますそれらのどれもなしです。

我々はどちらかself.leftまたはself.rightNoneであるかどうかを確認するための簡単なチェックを追加し、それに基づいて、それからの高さを得ることができます。

+0

ありがとうございました!! –

0

このようなエラーが表示された場合は、Noneのフィールドを使用することを意味します。あなたのツリーは有限であるため、データを持たないリーフがあります。 self.dataフィールドに値が割り当てられていますが、self.leftself.rightのコードには場所があります。同時に、heightメソッドのフィールドの値を取得する場合は、self.dataにのみチェックします。それは私には意味がありません。

また、pdbまたは別のデバッグツールを試すことをおすすめします。

関連する問題