题解:P16831 【MX-X29-T2】『FeOI-6』双色二叉树
题目传送门
思路
直接判断整棵树是不是满二叉树,是的话无解,不是的话有解。
证明:
先考虑必要性:
一棵高度为
所以满二叉树必无解。
再考虑充分性:
一棵二叉树不是满二叉树
设其为
那么我们只要将
所以非满二叉树必有解。
至此,我们得出有解的充要条件是整树是非满二叉树。
直接遍历树判断就行。
Code
#include <bits/stdc++.h>
using namespace std;
void slv(){
int n;
cin >> n;
vector<int> l(n + 1), r(n + 1);
for (int i = 1; i <= n; ++i){
cin >> l[i] >> r[i];
}
vector<int> num(n + 1, 0);
function<void(int)> dfs = [&](int u){
if (!l[u] and !r[u]){
num[u] = 1;
return;
}
if (l[u]){
dfs(l[u]);
}
if (r[u]){
dfs(r[u]);
}
if (num[l[u]] == 1 and num[r[u]] == 1){
num[u] = 1;
}
};
dfs(1);
cout << (!num[1] ? "Yes\n" : "No\n");
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--){
slv();
}
return 0;
}