PAT 1135 Is It A Red-Black Tree

原文鏈接:我的個人博客

原題鏈接

  PAT 1135 Is It A Red-Black Tree

考點

  樹

思路

  紅黑樹需要滿足的條件。

  • 樹的根節點是黑色
  • 紅色節點的兩個左右節點均是黑色
  • 每個路徑的黑色節點個數相同

因爲紅黑樹本身的特性,是特殊的二叉查找樹,因此,前序序列即是插入的序列。

代碼

#include <bits/stdc++.h>
using namespace std;
 
vector<int> arr;
struct node{
    int val;
    struct node *left,*right;
};
node* build(node *root,int v){
    if(root == NULL){
        root = new node();
        root->val = v;
        root->left=root->right = NULL;
    }else if(abs(v)<=abs(root->val)){
        root->left = build(root->left,v);
    }else{
        root->right = build(root->right,v);
    }
    return root;
}
//判斷紅節點的子節點是否爲黑節點 
bool fun1(node *root){
    if(root == NULL) return true;
    if(root->val<0){
        if(root->left!=NULL && root->left->val<0) return false;
        if(root->right!=NULL &&root->right->val<0) return false;
    }
    return fun1(root->left)&&fun1(root->right);
}
int getNum(node *root){
    if(root == NULL) return 0;
    int l = getNum(root->left);
    int r = getNum(root->left);
    return root->val>0? max(l,r)+1:max(l,r);
}
//判斷每個路徑的黑色節點是否相同
bool fun2(node *root){
    if(root ==NULL) return true;
    int l = getNum(root->left);
    int r = getNum(root->right);
    if(l!=r) return false;
    return fun2(root->left)&&fun2(root->right);
} 
int main(){
    int k,n;
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d",&n);
        arr.resize(n);
        node *root = NULL;
        for(int j=0;j<n;j++){
            scanf("%d",&arr[j]);
            root = build(root,arr[j]);
        }
        if(arr[0]<0||fun1(root)==false||fun2(root)==false)
            printf("No\n");
        else 
            printf("Yes\n");
    }
}

 

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