PAT 甲級 1135 Is It A Red-Black Tree (30 分) 結構體數組建樹+dfs

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章