[Leetcode週間のレース148] 1145バイナリーツリーの着色ゲーム

1145バイナリツリーの着色ゲームバイナリツリーの着色ゲーム

説明

ゲームの「バイナリーツリーの色付け」に関与する2人のオタクの選手。ゲーム、ルート所定のバイナリツリーのノード、木合計n個のノード、及びnが奇数、前記各ノードの値からなる1N異なります。

「ワン」プレイヤーは(「ワン」青赤、「II」のプレイヤーのプレイヤー)、当初、開始からゲーム

  • "1" からプレイヤー[1、N]は、x(1 <= xで<= N)の値をとります。
  • "II" のプレイヤーから取ることができる[1、n]の値y(1 <= Y <= n)とYの!= X.
  • 「一つは、」感染ノードに感染赤いXのノード、および「II」プレーヤーにプレーヤーが青色Yです。

2人のプレイヤーは各ラウンドを動作させるために交代した後、良好な色は彼を塗装する前にプレイヤーがノードを選択し、選択したノード未着色の隣接ノード(つまり、左と右の子ノード、または親)を染色しました。
現在のプレイヤーが染色されたようなノードを見つけることができない場合は、自分のターンがスキップされます。
2人の選手は、ノードのどれも染めていないことができている場合、ゲームオーバーです。着色は、ノード最も ✌️勝つために他のプレイヤーのを。

勝てない場合は、falseを返してください;さて、あなたは、このゲームに勝つtrueを返すことを確認するには、Yの値がある場合、あなたは、与えられた入力に応じて、「ナンバー2」の選手と仮定。

  • 例:
    1480バイナリツリー着色ゲーム

入力:ルート= [1,2,3,4,5,6,7,8,9,10,11]、N = 11、X = 3
出力:真の
説明:第2プレイヤは、2の値を選択することができノード。

  • ヒント:

    ルートノードは、N個の異なるバイナリツリーのルート、N個のツリーノードの値は、ノード1です。
    nが奇数です。
    1 <= X <= N < = 100

考え

それが停止しない場合は、ツリーのイタリアが双方向であるツリー内の各ノードは、つまり、他のノード相互接続され、任意のツリーは、任意のツリーのノードとすることができる
ツリーためのみ二点接続されているパスに、他の当事者が目標点を接続したいので、もし、あなたがパスの接続ポイントを占領し、その後、他はの目標点に接続することはできません
、この打ち上げのキーポイントの外部のポイントを接続するためにお互いをカットする可能性が最も高い:父节点/ 左子节点/ 右子节点
そうソリューション質問のためのアイデアは:お互いのカット父节点/ 左子节点/ 右子节点
場合は、その部分をカットは、他の2つの部分よりも大きく、表示します
三つに反対側を占有した後、

図から分かるように、値Xが相互に選択され、我々は三つの部分、以下を解決するための二分木、その結果に分けることができる:
左子节点DFS 右子节点DFS 父节点のNXノードDFS
三つの部分以上の最大値を選択するために、すなわち占め、N / 2よりも大きいか否かを判断します半分以上
自分の勝利の表現を持っています

コードの実装

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    // 三个部分的最大值
    int maxCount = 0;
    // 记录二叉树每个节点DFS的值
    int[] sizeOfNode = new int[150];
    
    // dfs 做法
    // 叶子节点置为1 其父节点为子节点之和+1
    int dfs(TreeNode root, int x) {
        int v = root.val;
        sizeOfNode[v] = 1;
        
        if (root.left != null) {
            int c = dfs(root.left, x);
            sizeOfNode[v] += c;
            // 如果当前节点为对方选取点, c就表示是其左子节点DFS的值
            if (x == v) {
                maxCount = Math.max(maxCount, c);
            }
        }
        if (root.right != null) {
            int c = dfs(root.right, x);
            sizeOfNode[v] += c;
            // 如果当前节点为对方选取点, c就表示是其右子节点DFS的值
            if (x == v) {
                maxCount = Math.max(maxCount, c);
            }
        }
        return sizeOfNode[v];
    }
    
    public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
        // 对二叉树进行DFS
        dfs(root, x);
        // 比对父节点 与左右子节点的最大值
        maxCount = Math.max(maxCount, n-sizeOfNode[x]);
        // 如果己方遍历节点数大于 n/2 则对方必然小于己方
        return maxCount > n/2;
    }
}

おすすめ

転載: www.cnblogs.com/slowbirdoflsh/p/11306493.html