码迷,mamicode.com
首页 > 其他好文 > 详细

1135 Is It A Red-Black Tree (30 分)

时间:2021-02-17 14:00:40      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!