2017-06-07 5 views
0

Pythonでバイナリツリーを実装するために以下のコードを記述しました。私は "AttributeErrorを取得します:" find_Node "メソッドを呼び出すとき、 'NoneType'オブジェクトに 'data' '属性がありません。私はこのエラーが何であるか知っていますが、 "find_Node"メソッドを呼び出すと、なぜそれが現れたのかわかりません。どんな手がかりも感謝します。ここでPythonのバイナリツリー実装で 'NoneType'オブジェクトに属性エラーがありません

は私のコードです:

#!/usr/bin/env python2 

class BinaryTree: 

    class Node: 

     def __init__(self,data,left=None,right=None): 
      self.data=data 
      self.left=left 
      self.right=right 

     def get_RightChild(self): 
      return self.right 

     def get_LeftChilld(self): 
      return self.left 

     def get_Nodedata(self): 
      return self.data 

     def set_NodeData(self,data): 
      self.data=data 

    def __init__(self,rootdata): 
     self.root=self.Node(rootdata) 
     self.size=1 

    def get_Root(self): 
     return self.root 

    def get_Size(self): 
     return self.size 


    def insert_LeftNode(self,data,root): 
     if root.left==None: 
      root.left=self.Node(data) 
     else: 
      self.insert_LeftNode(data,root.left) 
     self.size+=1 

    def insert_RightNode(self,data,root): 
     if root.right==None: 
      root.right=self.Node(data) 
     else: 
      self.insert_RightNode(data,root.right) 
     self.size+=1 

    #needs revision - does not work properly 
    def find_Node(self,data,root): 
     if root.data == data: 
      return 1 
     self.find_Node(data,root.right) 
     self.find_Node(data,root.left) 
     return 0 

    def preorder_Traverse(self,root): 
     if root != None: 
      print root.data, 
      self.preorder_Traverse(root.left) 
      self.preorder_Traverse(root.right) 

    def inorder_Traverse(self,root): 
     if root!=None: 
      self.inorder_Traverse(root.left) 
      print root.data, 
      self.inorder_Traverse(root.right) 

    def postorder_Traverse(self,root): 
     if root!=None: 
      self.postorder_Traverse(root.left) 
      self.postorder_Traverse(root.right) 
      print root.data, 


if __name__=="__main__": 
    mybinary=BinaryTree(314) 
    mybinary.insert_LeftNode(6,mybinary.get_Root()) 
    mybinary.insert_RightNode(7,mybinary.get_Root()) 
    mybinary.insert_LeftNode(2,mybinary.root.left) 
    mybinary.insert_RightNode(4,mybinary.root.left) 

    mybinary.inorder_Traverse(mybinary.get_Root()) 

    print 

    if mybinary.find_Node(7,mybinary.get_Root()): 
     print "found" 
    else: 
     print "Not Found!" 
+0

以下のコードをあなたのfind_Node方法を変更、またroot.leftまたはroot.rightNone可能性があり、Noneされます'が' find_Node'を再帰呼び出ししているときには 'None'ですが、' find_Node'のロジックも間違っています。 – Oswald

+0

私はしましたが、それでも動作しません。また、メインでは、rootがNoneではないことは明らかです。 – user3234347

答えて

0

チェックrootある `ルートかどうかをチェックする必要があり

def find_Node(self,data,root): 
    if(root is None): 
     return 0 
    if root.data == data: 
     return 1 
    return self.find_Node(data,root.right) or self.find_Node(data,root.left) 
関連する問題