PythonでMin-maxゲームツリーを埋めるプログラム
二人ゲームのゲーム状態を表す二分木があるとします。すべての内部ノードは0で埋められ、葉の値は終了スコアを表します。プレーヤー1はエンドスコアを最大化したいのに対し、プレーヤー2はエンドスコアを最小化したい。プレーヤー1は常に偶数レベルのノードで移動し、プレーヤー2は常に奇数レベルで移動します。両方のプレーヤーが最適にプレイすると仮定して、結果のスコアをバイナリツリーに入力する必要があります。
したがって、入力が次のような場合
その場合、出力は次のようになります
これを解決するには、次の手順に従います-
- 関数helper()を定義します。これはルート、h、currentHeightを取ります
- ルートが空の場合、
- 戻る
- ヘルパー(ルートの左側、h、currentHeight + 1)
- ヘルパー(ルートの右、h、currentHeight + 1)
- currentHeight
- currentHeightが偶数の場合、
- ルートの左側とルートの右側がnullでない場合、
- ルートの値:=ルートの左側の値の最大値、ルートの右側の値
- それ以外の場合、ルートの左側がnullでない場合は、
- ルートの値:=ルートの左側の値
- それ以外の場合、ルートの権利がnullでない場合は、
- ルートの値:=ルートの権利の値
- それ以外の場合、
- ルートの左側とルートの右側がnullでない場合、
- ルートの値:=ルートの左側の値の最小値、ルートの右側の値
- それ以外の場合、ルートの左側がnullでない場合は、
- ルートの値:=ルートの左側の値
- それ以外の場合、ルートの権利がnullでない場合は、
- ルートの値:=ルートの権利の値
- currentHeightが偶数の場合、
- 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,
-
特定のバイナリツリーがPythonのヒープであるかどうかを確認します
二分木があるとしましょう。ヒープかどうかを確認する必要があります。ヒープには次のプロパティがあります。ヒープはバイナリツリーになります。そのツリーは完全なツリーである必要があります(つまり、最後を除くすべてのレベルがいっぱいである必要があります)。そのツリーのすべてのノード値は、その子ノード(max-heap)以上である必要があります。 したがって、入力が次のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 関数number_of_nodes()を定義します。これが定着します rootがnullの場合、 0を返す それ以外の場合、
-
Pythonで二分木を反転する
二分木があるとします。私たちの仕事は、逆二分木を作成することです。したがって、ツリーが以下のようになっている場合- 反転したツリーは次のようになります これを解決するために、再帰的アプローチを使用します ルートがnullの場合は、戻ります 左右のポインタを入れ替える 左のサブツリーと右のサブツリーを再帰的に解決します 例(Python) 理解を深めるために、次の実装を見てみましょう- class TreeNode: def __init__(self, data, left = None, right = None):