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

Pythonの特定の二分木でBSTの最大合計値を見つけるプログラム


二分木が提供されていると仮定します。そのサブツリーに二分探索木(BST)が存在するかどうかを調べ、最大のBSTの合計を見つける必要があります。合計を求めるために、そのBSTの各ノードの値を加算します。合計値を出力として返します。

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

Pythonの特定の二分木でBSTの最大合計値を見つけるプログラム

その場合、出力は12になります。

与えられた二分木のBSTは-

です

Pythonの特定の二分木でBSTの最大合計値を見つけるプログラム

ノードの合計=12。

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

  • c:=0
  • m:=null
  • 値:=0
  • 関数recurse()を定義します。これはノードを取ります
    • ノードがnullでない場合、
      • left_val:=recurse(ノードの左側)
      • right_val:=recurse(ノードの権利)
      • count:=負の無限大
      • if(node.leftはnullまたはnode.left.val <=node.valと同じ)and((nodeの右側はnullまたはnode.val <=node.right.valと同じ)、then
          >
        • count:=left_val + right_val + 1
      • カウント>cの場合、
        • c:=カウント
        • m:=ノード
      • 返品数
    • 0を返す
  • 関数calculate_sum()を定義します。これは根を下ろします
    • rootがnullと同じでない場合、
      • calculate_sum(ルートの左側)
      • 値:=値+ルートの値
      • calculate_sum(ルートの権利)
  • recurse(root)
  • calculate_sum(m)
  • 戻り値

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

class TreeNode:
   def __init__(self, val, left = None, right = None):
      self.val = val
      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 solve(root):
   c, m, value = 0, None, 0
   def recurse(node):
      if node:
         nonlocal c, m
         left_val = recurse(node.left)
         right_val = recurse(node.right)
         count = -float("inf")
         if (node.left == None or node.left.val <= node.val) and (node.right == None or node.val <= node.right.val):
            count = left_val + right_val + 1
         if count > c:
            c = count
            m = node
         return count
      return 0
   def calculate_sum(root):
      nonlocal value
      if root is not None:
         calculate_sum(root.left)
         value += root.val
         calculate_sum(root.right)
   recurse(root)
   calculate_sum(m)
   return value

tree = make_tree([1, 4, 6, 3, 5])
print(solve(tree))

入力

tree = make_tree([1, 4, 6, 3, 5])
print(solve(tree))

出力

12

  1. Pythonで特定の二分木で最大の完全なサブツリーを見つける

    二分木があるとしましょう。この二分木で最大の完全なサブツリーのサイズを見つける必要があります。私たちが知っているように、完全な二分木は、おそらく最終レベルなしですべてのレベルが完全に満たされ、最終レベルに可能な限りすべてのキーが残っている場合、二分木です。 したがって、入力が次のような場合 その場合、出力はサイズとして4になり、順序どおりの走査は10、45、60、70になります。 これを解決するには、次の手順に従います- isComplete、isPerfectなどのいくつかのパラメーターを使用して戻り型を定義します。これらは最初はfalseで、次にsizeとrootTree、

  2. Pythonで特定の二分木で最大の完全なサブツリーを見つける

    特定の二分木があるとします。与えられた二分木で最大のパーフェクトサブツリーのサイズを見つける必要があります。私たちが知っているように、完全な二分木は、すべての内部ノードに2つの子があり、すべての葉が同じレベルにある二分木です。 したがって、入力が次のような場合 その場合、出力は3になり、サブツリーは これを解決するには、次の手順に従います- RetTypeと呼ばれる1つのブロックを定義します。これは、isPerfect、height、rootTreeを保持し、最初はすべて0です get_prefect_subtree()という関数を定義します。これはルートを取りま