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

Pythonでバイナリツリーのルートからリーフまでの最長の合計パスの合計を見つけるプログラム


二分木があるとすると、ルートからリーフノードまでの最長パスの合計を見つける必要があります。同じ長いパスが2つある場合は、合計が大きいパスを返します。

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

Pythonでバイナリツリーのルートからリーフまでの最長の合計パスの合計を見つけるプログラム

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

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

  • 関数rec()を定義します。これには時間がかかります

  • currがnullの場合、

    • return(0、0)

  • 大きい:=rec(currの左側)の最大値、rec(currの右側)

  • ペアを返します(bigger [0] + 1、bigger [1] + currの値)

  • メインの方法から、次のようにします-

  • ret:=rec(root)

  • retの1番目のインデックスを返す

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

class TreeNode:
   def __init__(self, val, left=None, right=None):
      self.val = val
      self.left = left
      self.right = right

class Solution:
   def solve(self, root):
      def rec(curr):
         if not curr:
            return (0, 0)
         bigger = max(rec(curr.left), rec(curr.right))
         return (bigger[0] + 1, bigger[1] + curr.val)
      return rec(root)[1]
ob = Solution()
root = TreeNode(2)
root.left = TreeNode(10)
root.right = TreeNode(4)
root.right.left = TreeNode(8)
root.right.right = TreeNode(2)
root.right.left.left = TreeNode(6)
print(ob.solve(root))

入力

root = TreeNode(2)
root.left = TreeNode(10)
root.right = TreeNode(4)
root.right.left = TreeNode(8)
root.right.right = TreeNode(2)
root.right.left.left = TreeNode(6)

出力

20

  1. Pythonで二分木の最大幅を見つけるプログラム

    二分木があるとすると、ツリー内の任意のレベルの最大幅を見つける必要があります。ここで、レベルの幅は、左端のノードと右端のノードの間に保持できるノードの数です。 したがって、入力がのような場合 その場合、出力は2になります これを解決するために、次の手順に従います- マップdを作成し、最小値と最大値を保持するには、最小値は最初は無限大で、最大値は0です 関数dfs()を定義します。これはルートを取ります、pos:=0、depth:=0 ルートがnullの場合、戻り値はありません d [depth、0] =d [depth、0]とposの最小値 d [d

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

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