标签:mat ring 子节点 printf size har code stdin getc
思路:在建树的同时进行判断,把建树的模板改一改就能用
#include<iostream> #include<queue> #include<string.h> #include<string> #include<map> #include<unordered_map> #include<vector> #include<algorithm> #include<cmath> #include<set> using namespace std; const int maxn =30 + 1; const int maxm = 1e6 + 1; #define INT_MAX 0x7777777 typedef long long ll; inline int read() { int X = 0; bool flag = 1; char ch = getchar(); while (ch < ‘0‘ || ch>‘9‘) { if (ch == ‘-‘) flag = 0; ch = getchar(); } while (ch >= ‘0‘ && ch <= ‘9‘) { X = (X << 1) + (X << 3) + ch - ‘0‘; ch = getchar(); } if (flag) return X; return ~(X - 1); } int T,n; bool isred[maxn]; vector<int>pre, ino; bool flg; map<int, int>M; int cnt; void init() { memset(isred, 0, sizeof(isred)); flg = 1; cnt = -1; n = read(); pre.resize(n); ino.resize(n); for (int i = 0; i < n; i++) { int t = read(); if (t < 0) { isred[i] = 1, t = -t; }//标记是否为红节点 pre[i] = ino[i] = t; } sort(ino.begin(), ino.end());//BST树性质,中序遍历就是key从小到大 for (int i = 0; i < ino.size(); i++) {//标记位置 M[ino[i]] = i; } } void build(int f, int num,int st1, int ed1, int st2, int ed2) { if (!flg)return; if (st1 > ed1) { //性质三说的叶子节点是在前序中序构造的原树的基础上再加上的节点,即原树的null位置还存在一个黑色节点 //到达黑色的叶子节点,看从根节点经过的黑色节点num是否全部相等 if (cnt == -1) {//第一个到达的叶子节点 cnt = num; } else { if (num != cnt) { flg = 0; } } return; } if (f && isred[st1]) {//两个红色节点不能相连 flg = 0; return; } if (!isred[st1])num += 1; int p = M[pre[st1]];//套用建树的模板 build(isred[st1], num, st1 + 1, p - st2 + st1, st2, p - 1); build(isred[st1], num, p - st2 + st1 + 1, ed1, p + 1, ed2); } int main() { //freopen("test.txt", "r", stdin); T = read(); while (T--) { init(); build(1, 0, 0, n - 1, 0, n - 1);//这里f要预设为1,确保根节点为黑,不能为红 if (flg) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }
1135 Is It A Red-Black Tree (30 分)
标签:mat ring 子节点 printf size har code stdin getc
原文地址:https://www.cnblogs.com/MYMYACMer/p/14400379.html