【LeetCode】Day206-二叉树着色游戏

题目

1145. 二叉树着色游戏【中等】

题解

官解说的实在是抽象了,看了下高赞题解,果然很清晰易懂
【LeetCode】Day206-二叉树着色游戏_第1张图片
以 x 为根,它的三个邻居(左儿子、右儿子和父节点)就对应着三棵子树:

  • 左子树
  • 右子树
  • 父节点子树

哪棵子树最大,二号玩家就选哪棵。

设n2为2号玩家(蓝色)最多可以染的节点个数,左子树大小为left,右子树大小为right,那么父节点子树的大小就是 n-1-left-right,因此
n 2 = m a x ( l e f t , r i g h t , n − 1 − l e f t − r i g h t ) n2=max(left, right, n-1-left-right) n2=max(left,right,n1leftright)
一号玩家(红色)染的节点个数为n-n2;

如果 n 2 > n − n 2 n_2>n-n_2 n2>nn2,即 2 ∗ n 2 > n 2*n_2>n 2n2>n 时,2号玩家获胜!

DFS 统计子树节点数目。

class Solution {
    int x,left,right;
    public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
        this.x=x;//重名要加this!
        dfs(root);
        int n2=Math.max(Math.max(left,right),n-1-left-right);
        return 2*n2>n;
    }
    //统计节点个数
    public int dfs(TreeNode root){
        if(root==null)
            return 0;
        int lnum=dfs(root.left);
        int rnum=dfs(root.right);
        if(root.val==x){
            left=lnum;
            right=rnum;
        }
        return lnum+rnum+1;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n),递归空间

你可能感兴趣的:(Leetcode进阶之路,leetcode,深度优先,算法,数据结构)