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

PythonでMin-maxゲームツリーを埋めるプログラム


二人ゲームのゲーム状態を表す二分木があるとします。すべての内部ノードは0で埋められ、葉の値は終了スコアを表します。プレーヤー1はエンドスコアを最大化したいのに対し、プレーヤー2はエンドスコアを最小化したい。プレーヤー1は常に偶数レベルのノードで移動し、プレーヤー2は常に奇数レベルで移動します。両方のプレーヤーが最適にプレイすると仮定して、結果のスコアをバイナリツリーに入力する必要があります。

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

PythonでMin-maxゲームツリーを埋めるプログラム

その場合、出力は次のようになります

PythonでMin-maxゲームツリーを埋めるプログラム

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

  • 関数helper()を定義します。これはルート、h、currentHeightを取ります
  • ルートが空の場合、
    • 戻る
  • ヘルパー(ルートの左側、h、currentHeight + 1)
  • ヘルパー(ルートの右、h、currentHeight + 1)
  • currentHeight
  • currentHeightが偶数の場合、
    • ルートの左側とルートの右側がnullでない場合、
      • ルートの値:=ルートの左側の値の最大値、ルートの右側の値
    • それ以外の場合、ルートの左側がnullでない場合は、
      • ルートの値:=ルートの左側の値
    • それ以外の場合、ルートの権利がnullでない場合は、
      • ルートの値:=ルートの権利の値
  • それ以外の場合、
    • ルートの左側とルートの右側がnullでない場合、
      • ルートの値:=ルートの左側の値の最小値、ルートの右側の値
    • それ以外の場合、ルートの左側がnullでない場合は、
      • ルートの値:=ルートの左側の値
    • それ以外の場合、ルートの権利がnullでない場合は、
      • ルートの値:=ルートの権利の値
  • 関数height()を定義します。これが定着します
  • rootがnullの場合、
    • 0を返す
  • return 1 +(最大の高さ(ルートの左側)、高さ(ルートの右側))
  • メインの方法から、次の手順を実行します-
  • h:=height(root)
  • helper(root、h、0)
  • ルートを返す
  • 理解を深めるために、次の実装を見てみましょう-

    class TreeNode:
       def __init__(self, data, left = None, right = None):
          self.val = data
          self.left = left
          self.right = right
    class Solution:
       def helper(self, root, h, currentHeight):
          if not root:
             return
             self.helper(root.left, h, currentHeight + 1)
             self.helper(root.right, h, currentHeight + 1)
             if currentHeight < h:
                if currentHeight % 2 == 0:
                   if root.left and root.right:
                      root.val = max(root.left.val, root.right.val)
                   elif root.left:
                      root.val = root.left.val
                   elif root.right:
                      root.val = root.right.val
                   else:
                      if root.left and root.right:
                         root.val = min(root.left.val, root.right.val)
                      elif root.left:
                         root.val = root.left.val
                      elif root.right:
                         root.val = root.right.val
       def height(self, root):
          if not root:
             return 0
             return 1 + max(self.height(root.left), self.height(root.right))
       def solve(self, root):
             h = self.height(root)
             self.helper(root, h, 0)
             return root
       def print_tree(root):
          if root is not None:
             print_tree(root.left)
             print(root.val, end = ', ')
          print_tree(root.right)
    ob = Solution()
    root = TreeNode(0)
    root.left = TreeNode(3)
    root.right = TreeNode(0)
    root.right.left = TreeNode(0)
    root.right.right = TreeNode(0)
    root.right.left.left = TreeNode(-3)
    root.right.right.right = TreeNode(4)
    print_tree(ob.solve(root))

    入力

    root = TreeNode(0)
    root.left = TreeNode(3)
    root.right = TreeNode(0)
    root.right.left = TreeNode(0)
    root.right.right = TreeNode(0)
    root.right.left.left = TreeNode(-3)
    root.right.right.right = TreeNode(4)

    出力

    3, 3, -3, -3, -3, 4, 4,

    1. 特定のバイナリツリーがPythonのヒープであるかどうかを確認します

      二分木があるとしましょう。ヒープかどうかを確認する必要があります。ヒープには次のプロパティがあります。ヒープはバイナリツリーになります。そのツリーは完全なツリーである必要があります(つまり、最後を除くすべてのレベルがいっぱいである必要があります)。そのツリーのすべてのノード値は、その子ノード(max-heap)以上である必要があります。 したがって、入力が次のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 関数number_of_nodes()を定義します。これが定着します rootがnullの場合、 0を返す それ以外の場合、

    2. Pythonで二分木を反転する

      二分木があるとします。私たちの仕事は、逆二分木を作成することです。したがって、ツリーが以下のようになっている場合- 反転したツリーは次のようになります これを解決するために、再帰的アプローチを使用します ルートがnullの場合は、戻ります 左右のポインタを入れ替える 左のサブツリーと右のサブツリーを再帰的に解決します 例(Python) 理解を深めるために、次の実装を見てみましょう- class TreeNode:    def __init__(self, data, left = None, right = None):