1145. 二叉树着色游戏
显示英文描述
- 用户通过次数153
- 用户尝试次数290
- 通过次数156
- 提交次数789
- 题目难度Medium
有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root
,树上总共有 n
个节点,且 n
为奇数,其中每个节点上的值从 1
到 n
各不相同。
游戏从「一号」玩家开始(「一号」玩家为红色,「二号」玩家为蓝色),最开始时,
「一号」玩家从 [1, n]
中取一个值 x
(1 <= x <= n
);
「二号」玩家也从 [1, n]
中取一个值 y
(1 <= y <= n
)且 y != x
。
「一号」玩家给值为 x
的节点染上红色,而「二号」玩家给值为 y
的节点染上蓝色。
之后两位玩家轮流进行操作,每一回合,玩家选择一个他之前涂好颜色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色。
扫描二维码关注公众号,回复:
9597577 查看本文章
如果当前玩家无法找到这样的节点来染色时,他的回合就会被跳过。
若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 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
比赛的时候因为没接触过二叉树,这道题就没有做,后来了解了一下二叉树后又重新做了一便,题目要求的当一号玩家选择初始点x后,找出是否存在一个初始点使得二号玩家一定能赢,而由于规则要求,那么二号玩家可选择的三个初始点为x的左右节点以及x的母亲节点,这样能保证二号能染色的范围固定且最大,再找出三个范围里面最大的与n/2比较,即可得出解。
class Solution {
public:
TreeNode* Find_note(int x, TreeNode* t)
{
TreeNode* k;
queue <TreeNode* >room;
room.push(t);
while (!room.empty())
{
TreeNode* save = room.front();
if (save->val == x)
return save;
room.pop();
if (save->left)
room.push(save->left);
if (save->right)
room.push(save->right);
}
return NULL;
}
int Find_Res(TreeNode* t)
{
if (t == NULL)
return 0;
return Find_Res(t->left) + Find_Res(t->right) + 1;
}
int Find_Num(int x, TreeNode* t,int n)
{
TreeNode* S = Find_note(x, t);
int L_N = Find_Res(S->left);
int R_N = Find_Res(S->right);
int S_N = n - L_N - R_N - 1;
return max(max(R_N, L_N),S_N);
}
bool btreeGameWinningMove(TreeNode* root, int n, int x) {
return Find_Num(x, root, n) > n / 2;
}
};