Binary Tree Coloring Game

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;
    }
}

 

710 artículos originales publicados · Me gusta 13 · Visitas 190,000+

Supongo que te gusta

Origin blog.csdn.net/u013325815/article/details/105384859
Recomendado
Clasificación