Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonを使用して親ポインターを使用して、バイナリツリーの最も低い共通の祖先を見つけるプログラム


二分木と2つの特定のノードxとyが与えられたとします。二分木から2つのノードの最も低い共通の祖先を見つける必要があります。二分木の最も低い共通の祖先は、ノードxとyの両方が子孫である最も低いノードです。特定のノードは、それ自体の子孫になることもできます。ノードを見つけて出力として返す必要があります。

ツリーのノード構造は次のようになります-

TreeNode:
   data: <integer>
   left: <pointer of TreeNode>
   right: <pointer of TreeNode>
   parent: <pointer of TreeNode>

解決策を見つける際には、親ポインタを利用する必要があります。

したがって、入力が次のような場合

Pythonを使用して親ポインターを使用して、バイナリツリーの最も低い共通の祖先を見つけるプログラム

およびx=3、y =7;その場合、出力は5になります。

3と7はどちらも5の子孫なので、答えは5になります。

これを解決するには、次の手順に従います-

  • path_p_r:=新しいリスト

  • xがnullでない場合は、実行してください

    • path_p_r

      の最後にxを挿入します
    • x:=xの親

  • yがnullでない場合は、実行してください

    • yがpath_p_rに存在する場合、

      • yを返す

    • y:=yの親

理解を深めるために、次の実装を見てみましょう-

class TreeNode:
   def __init__(self, data, left = None, right = None, parent = None):
      self.data = data
      self.left = left
      self.right = right
      self.parent = parent
def insert(temp,data):
   que = []
   que.append(temp)
   while (len(que)):
      temp = que[0]
      que.pop(0)
      if (not temp.left):
         if data is not None:
            temp.left = TreeNode(data, parent=temp)
         else:
            temp.left = TreeNode(0,parent=temp)
         break
      else:
         que.append(temp.left)
   if (not temp.right):
      if data is not None:
         temp.right = TreeNode(data,parent=temp)
      else:
         temp.right = TreeNode(0,parent=temp)
      break
   else:
      que.append(temp.right)
def make_tree(elements):
   Tree = TreeNode(elements[0])
   for element in elements[1:]:
      insert(Tree, element)
   return Tree
def search_node(root, element):
   if (root == None):
      return None
   if (root.data == element):
      return root
      res1 = search_node(root.left, element)
   if res1:
      return res1
   res2 = search_node(root.right, element)
   return res2
def solve(x, y):
   path_p_r = []
   while x:
      path_p_r.append(x)
      x = x.parent
   while y:
      if y in path_p_r:
         return y
      y = y.parent
root = make_tree([5, 3, 7, 2, 4, 1, 7, 6, 8, 10])
print(solve(search_node(root, 3), search_node(root, 7)).data)

入力

[5, 3, 7, 2, 4, 1, 7, 6, 8, 10], 3, 7

出力

5

  1. Pythonのバイナリツリーの最も低い共通の祖先

    二分木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[3,5,1,6,2,0,8、null、null、7,4]のような場合。ツリーは次のようになります- ここで、5と1のLCAは3です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用したル

  2. Pythonのバイナリ検索ツリーの最も低い共通の祖先

    二分探索木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[6、2、8、0、4、7、9、null、null、3、5]のような場合。ツリーは次のようになります- ここで、2と8のLCAは6です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用し