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

Pythonでバイナリツリーの最も頻繁なサブツリーの合計を見つけるプログラム


二分木があるとすると、最も頻繁なサブツリーの合計を見つける必要があります。ノードのサブツリーの合計は、実際には、ノード自体を含む、ノードの下のすべての値の合計です。

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

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

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

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

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

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