PAT1135 Is It A Red-Black Tree(红黑树)

题意:

给出一棵平衡二叉搜索树的先序序列,要求判断是否为红黑树

思路:

这题一开始我没意识到红黑树都是平衡二叉搜索树,知道后就先按照先序和中序建树,然后按照红黑树的定义,用递归判断每个节点的左右黑节点的个数即可

#include <bits/stdc++.h>
using namespace std;
const int maxn=50;
int pre[maxn],in[maxn];

struct node{
    int key;
    node *left,*right;
};

node * buildTree(int l,int r,int ll,int rr){
    if(l>r||ll>rr){
        return nullptr;
    }
    node *root=new node();
    int pos;
    for(pos=ll;pos<rr&&pre[l]!=in[pos];pos++);
    int numleft=pos-ll;
    int numright=rr-pos;
    root->key=pre[l];
    root->left=buildTree(l+1,l+numleft,ll,pos-1);
    root->right=buildTree(r-numright+1,r,pos+1,rr);
    return root;
}
bool cmp(int a,int b){
    return abs(a)<abs(b);
}

int check(node *root){
    if(!root)
        return 1;
    if(root->key<0){
        if(root->left&&root->left->key<0){
            return -1;
        }
        if(root->right&&root->right->key<0){
            return -1;
        }
    }
    int numleft=check(root->left);
    int numright=check(root->right);
    if(numright==-1||numleft==-1){
        return -1;
    }
    if(numleft==numright){
        if(root->key<0)
            return numleft;
        else
            return numleft+1;
    }else{
        return -1;
    }
}

int main(){
    int k,n;
    scanf("%d",&k);
    while(k--){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&pre[i]);
            in[i]=pre[i];
        }
        if(pre[0]<0){
            printf("No\n");
            continue;
        }
        sort(in,in+n,cmp);
        node *root=buildTree(0,n-1,0,n-1);
        if(check(root)!=-1){
            printf("Yes\n");
        }else{
            printf("No\n");
        }
    }
    return 0;
}

 

posted @ 2018-08-03 22:02  seasonal  阅读(86)  评论(0编辑  收藏  举报