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

Pythonで最も深い葉の最も低い共通の祖先


ルート化された二分木があるとすると、最も深い葉の最も低い共通の祖先を返す必要があります。そのことを覚えておく必要があります-

  • 二分木のノードは、子がない場合にのみリーフノードになります

  • ツリーのルートの深さは0であり、ノードの深さがdの場合、その各子の深さはd+1です。

  • SのすべてのノードがルートAのサブツリーにあるように、最大​​の深さを持つノードAのノードのセットSの最小の共通祖先。

入力が[1,2,3,4,5]の場合、

Pythonで最も深い葉の最も低い共通の祖先

その場合、出力は[2,4,5]

になります。

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

  • solve()と呼ばれるメソッドを定義します。これはノードを取ります。これは次のように機能します-

  • ノードが存在しない場合は、[0、None]

    のリストを返します
  • 左右のサブツリーにノードがない場合は、[1、None]

    のリストを返します。
  • d1、l:=solve(ノードの左側)、d2、r:=solve(ノードの右側)

  • d1> d2の場合、値[d1 + 1、l]

    のリストを返します。
  • それ以外の場合、d2> d1の場合、値[d2 + 1、r]

    のリストを返します。
  • 値[d1+1、ノード]

    のリストを返します
  • mainメソッドでは、-

    を実行します。
  • リスト:=Solve(root)

  • リターンリスト[1]

例(Python)

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

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 print_tree(root):
   #print using inorder traversal
   if root is not None:
      print_tree(root.left)
      print(root.data, end = ', ')
      print_tree(root.right)
class Solution(object):
   def lcaDeepestLeaves(self, root):
      return self.solve(root)[1]
   def solve(self,node):
      if not node:
         return [0,None]
      if not node.left and not node.right:
         return [1,node]
      d1,l = self.solve(node.left)
      d2,r = self.solve(node.right)
      if d1>d2:
         return [d1+1,l]
      elif d2>d1:
         return [d2+1,r]
      return [d1+1,node]
ob = Solution()
root = make_tree([1,2,3,4,5])
print_tree(ob.lcaDeepestLeaves(root))

入力

[1,2,3,4,5]

出力

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