1145. 二叉树着色游戏
有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root
,树上总共有 n
个节点,且 n
为奇数,其中每个节点上的值从 1
到 n
各不相同。
游戏从「一号」玩家开始(「一号」玩家为红色,「二号」玩家为蓝色),最开始时,
「一号」玩家从 [1, n]
中取一个值 x
(1 <= x <= n
);
「二号」玩家也从 [1, n]
中取一个值 y
(1 <= y <= n
)且 y != x
。
「一号」玩家给值为 x
的节点染上红色,而「二号」玩家给值为 y
的节点染上蓝色。
之后两位玩家轮流进行操作,每一回合,玩家选择一个他之前涂好颜色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色。
如果当前玩家无法找到这样的节点来染色时,他的回合就会被跳过。
若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y
值可以确保你赢得这场游戏,则返回 true
;若无法获胜,就请返回 false
。
示例:
输入:root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3 输出:True 解释:第二个玩家可以选择值为 2 的节点。
提示:
root
,树上由 n
个节点,节点上的值从 1
到 n
各不相同。n
为奇数。1 <= x <= n <= 100
原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 2.5 MB, 提交时间: 2023-02-03 09:43:33
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func btreeGameWinningMove(root *TreeNode, n, x int) bool { lsz, rsz := 0, 0 var dfs func(*TreeNode) int dfs = func(node *TreeNode) int { if node == nil { return 0 } ls := dfs(node.Left) rs := dfs(node.Right) if node.Val == x { lsz, rsz = ls, rs } return ls + rs + 1 } dfs(root) return max(max(lsz, rsz), n-1-lsz-rsz)*2 > n } func max(a, b int) int { if b > a { return b }; return a }
cpp 解法, 执行用时: 0 ms, 内存消耗: 10.4 MB, 提交时间: 2023-02-03 09:43:15
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: bool btreeGameWinningMove(TreeNode *root, int n, int x) { int lsz, rsz; function<int(TreeNode *)> dfs = [&](TreeNode *node) { if (node == nullptr) return 0; int ls = dfs(node->left); int rs = dfs(node->right); if (node->val == x) lsz = ls, rsz = rs; return ls + rs + 1; }; dfs(root); return max({lsz, rsz, n - 1 - lsz - rsz}) * 2 > n; } };
java 解法, 执行用时: 0 ms, 内存消耗: 39.1 MB, 提交时间: 2023-02-03 09:42:57
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { private int x, lsz, rsz; public boolean btreeGameWinningMove(TreeNode root, int n, int x) { this.x = x; dfs(root); return Math.max(Math.max(lsz, rsz), n - 1 - lsz - rsz) * 2 > n; } private int dfs(TreeNode node) { if (node == null) return 0; int ls = dfs(node.left); int rs = dfs(node.right); if (node.val == x) { lsz = ls; rsz = rs; } return ls + rs + 1; } }
python3 解法, 执行用时: 44 ms, 内存消耗: 15.1 MB, 提交时间: 2023-02-03 09:42:41
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right ''' 贪心策略,选以x为根节点的包含最多节点的子树根 ''' class Solution: def btreeGameWinningMove(self, root: Optional[TreeNode], n: int, x: int) -> bool: lsz = rsz = 0 def dfs(node: Optional[TreeNode]) -> int: if node is None: return 0 ls = dfs(node.left) rs = dfs(node.right) if node.val == x: nonlocal lsz, rsz lsz, rsz = ls, rs return ls + rs + 1 dfs(root) return max(lsz, rsz, n - 1 - lsz - rsz) * 2 > n