Dos jugadores juegan un juego por turnos en un árbol binario. Se nos da el root
de este árbol binario y el número de nodos n
en el árbol. n
es impar, y cada nodo tiene un valor distinto de 1
a n
.
Inicialmente, el primer jugador nombra un valor x
con 1 <= x <= n
, y el segundo jugador nombra un valor y
con 1 <= y <= n
y y != x
. El primer jugador colorea el nodo con valor x
rojo, y el segundo jugador colorea el nodo con valor y
azul.
Luego, los jugadores se turnan para comenzar con el primer jugador. En cada turno, ese jugador elige un nodo de su color (rojo si el jugador 1, azul si el jugador 2) y colorea a un vecino incoloro del nodo elegido (ya sea el niño izquierdo, el niño derecho o el padre del nodo elegido).
Si (y solo si) un jugador no puede elegir dicho nodo de esta manera, debe pasar su turno. Si ambos jugadores pasan su turno, el juego termina y el ganador es el jugador que colorea más nodos.
Eres el segundo jugador. Si es posible elegir uno y
para asegurarse de ganar el juego, regrese true
. Si no es posible, regrese false
.
Ejemplo 1:
Entrada: raíz = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3 Salida: verdadera Explicación: El segundo jugador puede elegir el nodo con valor 2 .
Idea: después de colocar el punto rojo, el punto azul tiene solo tres posiciones, tres posiciones principal, izquierda y derecha para encerrar el rojo, y siempre que haya un área controlada en las tres direcciones que puede ser mayor que n / 2, representa El azul ganará. Cómo encontrar el rango controlado por el padre, use n-red left-red right-1
DFS es encontrar el número de todos los nodos, incluido este nodo;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int xleft = 0;
private int xright = 0;
public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
if(root == null) {
return false;
}
dfs(root, x);
return Math.max(n - xleft - xright - 1, Math.max(xleft, xright)) > n / 2;
}
private int dfs(TreeNode node, int x) {
if(node == null) {
return 0;
}
int leftcount = dfs(node.left, x);
int rightcount = dfs(node.right, x);
if(node.val == x) {
xleft = leftcount;
xright = rightcount;
}
return leftcount + rightcount + 1;
}
}