Pythonでバイナリツリーの最も頻繁なサブツリーの合計を見つけるプログラム
二分木があるとすると、最も頻繁なサブツリーの合計を見つける必要があります。ノードのサブツリーの合計は、実際には、ノード自体を含む、ノードの下のすべての値の合計です。
したがって、入力が次のような場合
その場合、出力は2回発生するため3になります。1回は左の葉として、もう1回は3-6+6の合計として発生します。
これを解決するには、次の手順に従います-
- count:=空のマップ
- 関数getSum()を定義します。これはノードを取ります
- ノードがnullの場合、
- 0を返す
- mySum:=getSum(ノードの左側)+ getSum(ノードの右側)+ノードの値
- count [mySum]:=count [mySum] + 1
- mySumを返す
- メインの方法から次の手順を実行します
- getSum(root)
理解を深めるために、次の実装を見てみましょう-
例
from collections import defaultdict class TreeNode: def __init__(self, data, left = None, right = None): self.val = data self.left = left self.right = right class Solution: def solve(self, root): count = defaultdict(int) def getSum(node): if not node: return 0 mySum = getSum(node.left) + getSum(node.right) + node.val count[mySum] += 1 return mySum getSum(root) return max(count, key=count.get) ob = Solution() root = TreeNode(-6) root.left = TreeNode(3) root.right = TreeNode(6) print(ob.solve(root))
入力
root = TreeNode(-6) root.left = TreeNode(3) root.right = TreeNode(6)
出力
3
-
Pythonでバイナリツリーの任意のパスの最大合計を見つけるプログラム
二分木があるとすると、ルートノードからリーフノードに向かうパスの最大の合計を見つける必要があります。 したがって、入力が次のような場合 その場合、出力はルートからのように29になります。パス5-<9- <7- <8をたどると、加算後は29になります。 これを解決するために、次の手順に従います- 関数walk()を定義します。これはノードを取ります、s ノードがnullの場合、 max_sum:=max_sumとsの最大値 戻る s:=s+ノードのデータ ウォーク(ノードの左側、s) ウォーク(ノードの右側、s) 主な方法から次の
-
Pythonでの二分木最大パス合計
空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri