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

Pythonでバイナリツリーの任意のパスの最大合計を見つけるプログラム


二分木があるとすると、ルートノードからリーフノードに向かうパスの最大の合計を見つける必要があります。

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

Pythonでバイナリツリーの任意のパスの最大合計を見つけるプログラム

その場合、出力はルートからのように29になります。パス5-<9- <7- <8をたどると、加算後は29になります。

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

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

  • ノードがnullの場合、

    • max_sum:=max_sumとsの最大値

    • 戻る

  • s:=s+ノードのデータ

  • ウォーク(ノードの左側、s)

  • ウォーク(ノードの右側、s)

  • 主な方法から次のことを行います-

  • max_sum:=0

  • walk(root、0)

  • max_sumを返す

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

from collections import defaultdict
   class TreeNode:
      def __init__(self, data, left = None, right = None):
         self.data = data
         self.left = left
         self.right = right
   class Solution:
      def walk(self, node, s):
         if not node:
            self.max_sum = max(self.max_sum, s)
         return
      s += node.data
      self.walk(node.left, s)
      self.walk(node.right, s)
   def solve(self, root):
      self.max_sum = 0
      self.walk(root, 0)
   return self.max_sum
ob = Solution()
root = TreeNode(5)
root.left = TreeNode(1)
root.right = TreeNode(9)
root.right.left = TreeNode(7)
root.right.right = TreeNode(10)
root.right.left.left = TreeNode(6)
root.right.left.right = TreeNode(8)
print(ob.solve(root))

入力

root = TreeNode(5)
root.left = TreeNode(1)
root.right = TreeNode(9)
root.right.left = TreeNode(7)
root.right.right = TreeNode(10)
root.right.left.left = TreeNode(6)
root.right.left.right = TreeNode(8)

出力

29

  1. Pythonでの二分木最大パス合計

    空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri

  2. Pythonでのパスの合計

    1つのツリーと合計があるとします。そのパスをたどると、与えられた合計と一致する合計が得られるように、1つのパスを見つける必要があります。ツリーが[0、-3,9、-10、null、5]のようで、合計が14であるとすると、パス0→9→5があります。 これを解決するために、次の手順に従います。 ルートがnullの場合は、Falseを返します 左右のサブツリーが空の場合、sum – root.val =0の場合はtrueを返し、それ以外の場合はfalseを返します 戻り値solve(root.left、sum – root.val)またはsolve(root.right、su