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

Pythonでツリーの隣接していないノードの最大合計を見つけるプログラム


二分木があるとすると、2つの値が親から子に隣接できない場合に、取得できる値の最大合計を見つける必要があります。

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

Pythonでツリーの隣接していないノードの最大合計を見つけるプログラム

10、4、3が互いに隣接していないため、出力は17になります。

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

  • 関数f()を定義します。これはノードを取ります
  • ノードがnullの場合、
    • return(0、0)
  • (a、b):=f(ノードの左側)
  • (c、d):=f(ノードの右側)
  • ペアを返します(ノード+ b+dとa+c、a + cの値の最大値)
  • メインメソッドからf(root)を呼び出し、その最初の値を返します

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

class TreeNode:
def __init__(self, data, left = None, right = None):
   self.val = data
   self.left = left
   self.right = right
def f(node):
   if not node:
      return 0, 0
   a, b = f(node.left)
   c, d = f(node.right)
   return max(node.val + b + d, a + c), a + c
class Solution:
   def solve(self, root):
      return f(root)[0]
ob = Solution()
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(10) root.left.left = TreeNode(4) root.left.right = TreeNode(3) print(ob.solve(root))

入力

root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(10)
root.left.left = TreeNode(4)
root.left.right = TreeNode(3)

出力

17

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

    二分木があるとすると、ルートノードからリーフノードに向かうパスの最大の合計を見つける必要があります。 したがって、入力が次のような場合 その場合、出力はルートからのように29になります。パス5-<9- <7- <8をたどると、加算後は29になります。 これを解決するために、次の手順に従います- 関数walk()を定義します。これはノードを取ります、s ノードがnullの場合、 max_sum:=max_sumとsの最大値 戻る s:=s+ノードのデータ ウォーク(ノードの左側、s) ウォーク(ノードの右側、s) 主な方法から次の

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

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