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

Pythonを使用して、特定のノードのバイナリツリーの最も低い共通の祖先を見つけるプログラム


バイナリツリーが与えられ、ツリー内のすべてのノードの最も低い共通の祖先を見つけるように求められたとします。バイナリツリーの最も低い共通の祖先は、ノードx1、x2、x3、....、xnが子孫である最も低いノードです。特定のノードは、それ自体の子孫になることもできます。ノードを見つけて出力として返す必要があります。入力は、ツリーのルートノードと、祖先を見つける必要があるノードのリストです。

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

Pythonを使用して、特定のノードのバイナリツリーの最も低い共通の祖先を見つけるプログラム

祖先を見つける必要があるノードのリストは[6、8]です。その場合、出力は7になります。

ノード6と8が子孫である最下位ノードが7であるため、出力は7です。

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

  • 関数fn()を定義します。これはノードを取ります

    • ノードがnullに類似している場合、

      • リターンノード

    • それ以外の場合、ノードがノードに事前設定されている場合、

      • リターンノード

    • left:=fn(ノードの左側)、

    • right:=fn(ノードの右側)

    • 左右がnullでない場合、

      • リターンノード

    • それ以外の場合

      • 左または右がnullでない場合、

        • リターンノード

  • ノード:=新しいリスト

  • node_listの各要素について、次のようにします

    • ノードの最後にsearch_node(root、elem)を挿入します

  • ノード:=ノードからの新しいセット

  • fn(root)を返す

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

import collections
class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.data = data
      self.left = left
      self.right = right
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)
         else:
            temp.left = TreeNode(0)
         break
      else:
         que.append(temp.left)
      if (not temp.right):
         if data is not None:
            temp.right = TreeNode(data)
         else:
            temp.right = TreeNode(0)
         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 print_tree(root):
   if root is not None:
      print_tree(root.left)
      print(root.data, end = ', ')
      print_tree(root.right)
def solve(root, node_list):
   nodes = []
   for elem in node_list:
      nodes.append(search_node(root, elem))
      nodes = set(nodes)
def fn(node):
   if not node:
      return node
   elif node in nodes:
      return node
      left, right = fn(node.left), fn(node.right)
      return node if left and right else left or right
   return fn(root)
root = make_tree([5, 3, 7, 2, 4, 6, 8])
print(solve(root, [6,8]).data)

入力

make_tree([5, 3, 7, 2, 4, 6, 8]), [6, 8]

出力

7

  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を使用し