这道题不用建树也可以写,先用搜索树排序得到中序遍历,用中序遍历和先序遍历搜一遍每个根节点到NULL叶子节点的黑色点个数即可
#include <bits/stdc++.h>
using namespace std;
vector <int > pre , in;
map<int , int > Index;
int sum = 0 , flag = 0;
void build(int root , int l , int r , int black , int fa){
if(l > r){
black++;
if(sum == 0){
sum = black;
}
else if(sum != black){
flag = 1;
}
return;
}
if(pre[fa] < 0 && pre[root] < 0){
flag = 1;
return ;
}
black += pre[root] > 0 ? 1 : 0;
if(l == r){
black++;
if(sum == 0){
sum = black;
}
else if(sum != black){
flag = 1;
}
return ;
}
int temp = Index[pre[root]];
build(root+1 , l , temp-1 , black , root);
build(temp-l+root+1 , temp+1 , r , black , root);
}
bool cmp(int x , int y){
return abs(x) < abs(y);
}
int main(){
int m , n;
cin >> m;
for(int i = 0; i < m; ++i){
cin >> n;
pre.resize(n+1);
in.resize(n+1);
sum = flag = 0;
for(int j = 1; j <= n; ++j){
cin >> pre[j];
in[j] = pre[j];
}
sort(in.begin()+1 , in.end() , cmp);
for(int j = 1; j <= n; ++j){
Index[in[j]] = j;
}
build(1 , 1 , n , 0 , 1);
if(flag == 1){
cout << "No" << endl;
}
else if(pre[1] > 0){
cout << "Yes" << endl;
}
}
return 0;
}