node结构体数组建树写法
指针建树及题意思路详见:https://blog.csdn.net/xiang_6/article/details/100128763
#include<bits/stdc++.h>
#include<cstring>
#define FI first
#define SE second
using namespace std;
typedef long long ll;
typedef pair<string, string> P;
const int maxn = 100 + 7;
int n, a[maxn];
struct node {
int v, f = -1;
int l, r;
}t[maxn];
void ins(int id, int pos, int va) {
if(abs(va) <= abs(t[id].v)) {
if(t[id].l == -1) {
t[id].l = pos;
t[pos].f = 1;
t[pos].v = va;
}
else ins(t[id].l, pos, va);
}
else {
if(t[id].r == -1) {
t[id].r = pos;
t[pos].f = 1;
t[pos].v = va;
}
else ins(t[id].r, pos, va);
}
return;
}
void init() {
for(int i = 1; i <= n; ++i) {
t[i].f = t[i].l = t[i].r = -1;
}
t[1].v = a[1];
for(int i = 2; i <= n; ++i) {
ins(1, i, a[i]);
}
}
bool ok1(int id) {
if(t[id].v < 0) {
if(t[id].l != -1 && t[t[id].l].v < 0) return false;
if(t[id].r != -1 && t[t[id].r].v < 0) return false;
}
if(t[id].l != -1 && !ok1(t[id].l)) return false;
if(t[id].r != -1 && !ok1(t[id].r)) return false;
return true;
}
set<int> st;
void dfs(int id, int cnt) {
if(t[id].f == -1) {
st.insert(cnt);
return;
}
int tt = 0;
if(t[id].v > 0) tt = 1;
if(t[id].l == -1 || t[id].r == -1) {
st.insert(cnt+tt);
}
if(t[id].l != -1) dfs(t[id].l, cnt+tt);
if(t[id].r != -1) dfs(t[id].r, cnt+tt);
}
bool ok2(int id) {
for(int i = 1; i <= n; ++i) {
st.clear();
dfs(i, 0);
if(st.size() != 1) return false;
}
return true;
}
int main() {
int T; cin >> T;
while(T--) {
cin >> n;
for(int i = 1; i <= n; ++i) cin >> a[i];
if(n == 0) {
puts("Yes");
continue;
}
init();
int x;
bool f1 = ok1(1);
bool f2 = ok2(1);
if(a[1] < 0 || !f1 || !f2) {
puts("No");
}
else {
puts("Yes");
}
}
return 0;
}