题目
1145. 二叉树着色游戏【中等】
题解
官解说的实在是抽象了,看了下高赞题解,果然很清晰易懂
以 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,n−1−left−right)
一号玩家(红色)染的节点个数为n-n2;
如果 n 2 > n − n 2 n_2>n-n_2 n2>n−n2,即 2 ∗ n 2 > n 2*n_2>n 2∗n2>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),递归空间