Python 實現極大極小博弈樹填充程式
假設我們有一棵二叉樹,表示一個兩人遊戲的博弈狀態。每個內部節點都填充為 0,葉子節點的值表示最終得分。玩家 1 希望最大化最終得分,而玩家 2 希望最小化最終得分。玩家 1 始終在偶數層節點上進行移動,玩家 2 始終在奇數層節點上進行移動。我們必須在二叉樹中填充結果分數,假設兩位玩家都以最佳方式進行遊戲。
因此,如果輸入類似於

則輸出將是

為了解決這個問題,我們將遵循以下步驟:
- 定義一個函式 helper()。它將接收根節點 root、樹的高度 h 和當前高度 currentHeight 作為引數。
- 如果根節點為空,則
- 返回。
- 遞迴呼叫 helper(root 的左子節點, h, currentHeight + 1)
- 遞迴呼叫 helper(root 的右子節點, h, currentHeight + 1)
- 如果 currentHeight 小於 h,則
- 如果 currentHeight 為偶數,則
- 如果 root 的左子節點和右子節點都不為空,則
- root 的值 := root 的左子節點的值和右子節點的值中的最大值
- 否則,如果 root 的左子節點不為空,則
- root 的值 := root 的左子節點的值
- 否則,如果 root 的右子節點不為空,則
- root 的值 := root 的右子節點的值
- 如果 root 的左子節點和右子節點都不為空,則
- 否則,
- 如果 root 的左子節點和右子節點都不為空,則
- root 的值 := root 的左子節點的值和右子節點的值中的最小值
- 否則,如果 root 的左子節點不為空,則
- root 的值 := root 的左子節點的值
- 否則,如果 root 的右子節點不為空,則
- root 的值 := root 的右子節點的值
- 如果 root 的左子節點和右子節點都不為空,則
- 如果 currentHeight 為偶數,則
- 定義一個函式 height()。它將接收根節點 root 作為引數。
- 如果 root 為空,則
- 返回 0。
- 返回 1 + (root 的左子節點的高度和右子節點的高度中的最大值)
- 在主方法中,執行以下操作:
- h := height(root)
- helper(root, h, 0)
- 返回 root
讓我們看看下面的實現,以便更好地理解:
示例
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,
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP