原文鏈接:我的個人博客
原題鏈接
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");
}
}