1

私はバイナリツリーを作成しました。私は手動で渡しているノードの親を見つけようとしています。それは左のサブツリーではうまく動作しますが、右のサブツリーには特定のノードだけがあります。python-与えられたノードの親を印刷する方法

# To create a tree from scratch 
class tree: 
    """To create nodes each time an instance has been 
    created""" 
    def __init__(self, key): 
     self.data = key 
     self.left = None 
     self.right = None 

    def parent_search(self, root, child_node): 
     if root : 
     if root.left.data== child_node: 
      return root.data 
     if root.right.data== child_node: 
      return root.data 
     elif root: 
      return self.parent_search(root.left, child_node) 
      return self.parent_search(root.right, child_node) 

root = tree(10) 
root.left = tree(20) 
root.left.left = tree(90) 
root.left.right = tree(100) 
root.left.left.left = tree(80) 
root.right = tree(30) 
root.right.left = tree(40) 
root.right.right = tree(50) 
print(root.parent_search(root,80)) 

私はroot.parent_search(root,80)を与える場合、私はそれは私にNonetypeエラーになります右に40を仮定検索する場合、私は80の親として90を得る.but。

return self.parent_search(root.left, child_node) 
    File "/home/vaibhav/Desktop/Data_Structures/python_play_area.py", line 14, in parent_search 
    if root.right.data== child_node: 
AttributeError: 'NoneType' object has no attribute 'data' 

観察 私は、我々はそれが親または子の電話の際root.left.rightが正常に渡されたばかり見ることができるので、サブツリーの右の子を持つ任意の問題を参照してくださいいけません。

+0

再帰は、root.leftまたはroot.rightがNoneの場合を処理する必要があります。また、 'elif root:'の後の文は、2つのリターンがあるので動作しません。 2番目のreturn文は決して実行されません。 –

+0

どこにroot.leftを追加すべきか、root.rightはNoneであり、なぜ2つのリターンが機能しないのか。説明してください – codaholic

+0

メソッドが返っても、もう実行されないので、2番目のreturn文は決して実行されません。コメントはフォーマットが難しいので、私は答えを投稿します。 –

答えて

2

なぜ2つのreturnを使用したのか分かりますが、関数から何かを返す必要があり、左右の配列の両方でこれを呼び出す必要があります。そのためにはorを使用してください。 、something or Noneは常にsomething

def parent_search(self, root, child_node): 
    if not root: return None 
    if root.left and root.left.data==child_node: return root 
    if root.right and root.right.data==child_node: return root 
    return self.parent_search(root.left, child_node) or self.parent_search(root.right, child_node) 
+1

メソッドのシグネチャで 'self'パラメータを削除し、最後の行で' self'を 'root'に置き換えることで静的メソッドにすることができます。 –

+1

指摘に感謝します。しかし、OPのために、私の個人的な哲学は完璧な答えを与えることではなく、変化の量が最小限のものです... –

+0

私は自分のコードに変更を加え、答えとして投稿しました。 Shihab、johnあなたの貢献に感謝私はさらに私たちはさらに根の条件ではない場合は必要ではなく、コードを最小限の変更で動作させる – codaholic

0

を返すので、私はちょうどroot.left ==子とそれが働いていた場合の条件でroot.left場合は追加することによって、自分のコードに小さな変更を行いました。これは私がやった最小限の変更です。

# To create a tree from scratch 
class tree: 
    """To create nodes each time an instance has been 
    created""" 
    def __init__(self, key): 
     self.data = key 
     self.left = None 
     self.right = None 

    def parent_search(self, root, child_node): 
     if root : 
      if root.left and root.left.data== child_node: 
       return root.data 
      if root.right and root.right.data== child_node: 
       return root.data 
      elif root: 
       return self.parent_search(root.left, child_node) or self.parent_search(root.right, child_node) 


root = tree(10) 
root.left = tree(20) 
root.left.left = tree(90) 
root.left.right = tree(100) 
root.left.left.left = tree(80) 
root.right = tree(30) 
root.right.left = tree(40) 
root.right.right = tree(50) 
print(root.parent_search(root,50)) 
関連する問題