PAT甲级 1135 红黑树判断

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.jpg

rbf2.jpg

rbf3.jpg

Figure 1Figure 2Figure 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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;
struct TreeNode{
    int data,color;
    TreeNode *left,*right;
    TreeNode(int data){
        this->data = abs(data);
        this->color = data<0?1:0;
    }
};
int n,m;
int node[31];
TreeNode* build(int start,int end){
    if(start>end) return nullptr;
    TreeNode* root = new TreeNode(node[start]);
    int index = -1;
    for(int i=start+1;i<=end;i++){
        if(abs(node[i])>=abs(node[start])){
            index = i;
            break;
        }
    }
    
    if(index!=-1){
        root->left = build(start+1,index-1);
        root->right = build(index,end);
    }else{
        root->left = build(start+1,end);
    }
    return root;
}

int dfs(TreeNode* root){
    if(root==nullptr) return 0;
    int l,r;
    if(root->color==0){
        l = dfs(root->left)+1;
        r = dfs(root->right)+1;
    }else{
        l = dfs(root->left);
        r = dfs(root->right);
    }
    return max(l,r);
}

bool check(TreeNode* root){
    if(root==nullptr) return true;
    if(root->color==1) return false;
    queue<TreeNode*> q;
    q.push(root);
    while(!q.empty()){
        TreeNode* cur = q.front();
        q.pop();
        
        if(dfs(cur->left)!=dfs(cur->right)) return false;
        if(cur->left!=nullptr){
            if(cur->color==1&&cur->left->color==1) return false;
            else q.push(cur->left);
        } 
        if(cur->right!=nullptr){
            if(cur->color==1&&cur->right->color==1) return false;
            else q.push(cur->right);
        }
    }
    return true;
}

int main(){
    cin>>n;
    while(n--){
        cin>>m;
        for(int i=0;i<m;i++) cin>>node[i];
        TreeNode *root = build(0,m-1);
        bool t = check(root);
        if(t) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值