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


    There is a kind of balanced binary search tree named red-black tree in the data structure. It has the following 5 properties:

    • (1) Every node is either red or black.
    • (2) The root is black.
    • (3) Every leaf (NULL) is black.
    • (4) If a node is red, then both its children are black.
    • (5) For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.

    For example, the tree in Figure 1 is a red-black tree, while the ones in Figure 2 and 3 are not.

    rbf1.jpgrbf2.jpgrbf3.jpg
    Figure 1 Figure 2 Figure 3

    For each given binary search tree, you are supposed to tell if it is a legal red-black tree.

    Input Specification:

    Each input file contains several test cases. The first line gives a positive integer K (≤30) which is the total number of cases. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the preorder traversal sequence of the tree. While all the keys in a tree are positive integers, we use negative signs to represent red nodes. All the numbers in a line are separated by a space. The sample input cases correspond to the trees shown in Figure 1, 2 and 3.

    Output Specification:

    For each test case, print in a line "Yes" if the given tree is a red-black tree, or "No" if not.

    Sample Input:

    3
    9
    7 -2 1 5 -4 -11 8 14 -15
    9
    11 -2 1 -7 5 -4 8 14 -15
    8
    10 -7 5 -6 8 15 -11 17
     

    Sample Output:

    Yes
    No
    No
     
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    #define  inf  0x3fffffff
    vector<int> vis;
    typedef struct node{
        int data;
        struct node *lchild;
        struct node *rchild;
    }node,*pnode;
    void build(pnode &root,int temp){
        if(root==NULL){
            root=new node;
            root->data=temp;
            root->lchild=root->rchild=NULL;
            return ;
        }
        else if(abs(temp)<=abs(root->data)){
            build(root->lchild,temp);
        }
        else{
            build(root->rchild,temp);
        }
    
    }
    bool judge1(pnode root){
        if(root==NULL){
            return true;
        }
        if(root->data<0){
            if(root->lchild!=NULL&&root->lchild->data<0){
                return false;
            }
            if(root->rchild!=NULL&&root->rchild->data<0){
                return false;
            }
        }
        return judge1(root->lchild)&&judge1(root->rchild);
    }
    int getNum(pnode root){
        if(root==NULL){
            return 0;
        }
        int l=getNum(root->lchild);
        int r=getNum(root->rchild);
        return root->data>0?max(l,r)+1:max(l,r);
    }
    bool judge2(pnode root){
        if(root==NULL){
            return true;
        }
        int l=getNum(root->lchild);
        int r=getNum(root->rchild);
        if(l!=r){
            return false;
        }
        return judge2(root->lchild)&&judge2(root->rchild);
    }
    int main(){
        int n,m;
        scanf("%d",&n);
        while(n--){
            pnode root=NULL;
            scanf("%d",&m);
            vis.resize(n);
            for(int i=0;i<m;i++){
                scanf("%d",&vis[i]);
                build(root,vis[i]);
            }
            if(vis[0]<0||judge1(root)==false||judge2(root)==false){
                printf("No
    ");
            }
            else{
                printf("Yes
    ");
            }
        }
        return 0;
    }
     
  • 相关阅读:
    zoj 3135 Party of 8g 最大点权独立集
    hdu 5352 MZL's City 最小费用最大流
    hdu 5351 MZL's Border 打表+高精度
    poj 3155 Hard Life 最大密度子图
    希尔排序的温习
    折半查找法的温习
    几所可能去的院校之对比与抉择
    重温排序算法
    5-17 汉诺塔的非递归实现 (25分)
    c语言从文件中读取数据作为输入
  • 原文地址:https://www.cnblogs.com/dreamzj/p/14444480.html
Copyright © 2020-2023  润新知