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
题解:
本题考察红黑树,可以根据题目给出的数据直接构建二叉树,不需要去了解红黑树在构建过程中的左旋右旋以及其他规则,
根据红黑树的定义:
1.每个节点只能是红色或黑色
2.根节点是黑色
3.每个为NULL
的叶子节点是黑色
4.如果节点为红色,他的左右孩子均为黑色
5.从一个节点到其所有叶子节点,其经历的黑色节点数均相同
依据以上规则,只用进行一下判断:
1.根节点是否为黑色
2.每个红色节点的左右孩子是否均为黑色
3.从每个节点到其所有叶子节点,其经历的黑色节点数均相同
#include <iostream>
#include <vector>
using namespace std;
struct node{
int v;
node *lchild,*rchild;
};
int n,k;
vector<int> arr;
void create(node* &root,int v){
if(root == NULL){
root = new node();
root->v = v;
return;
}
if(abs(v) < abs(root->v)){
create(root->lchild,v);
}
else{
create(root->rchild,v);
}
}
bool judge1(node* root){
if(root == NULL) return true;
if(root->v < 0){
if(root->lchild != NULL && root->lchild->v < 0) return false;
if(root->rchild != NULL && root->rchild->v < 0) return false;
}
return judge1(root->lchild) && judge1(root->rchild);
}
int getNum(node* root){
if(root == NULL) return 0;
int l = getNum(root->lchild);
int r = getNum(root->rchild);
return root->v > 0 ? max(l,r)+1:max(l,r);
}
bool judge2(node* 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(){
cin >> n;
for(int i = 0;i<n;i++){
cin >> k;
arr.resize(k);
node* root = NULL;
for(int j = 0;j<k;j++){
scanf_s("%d",&arr[j]);
create(root,arr[j]);
}
if(arr[0] < 0 || judge1(root) == false || judge2(root) == false){
cout << "No" << endl;
}
else{
cout << "Yes" << endl;
}
}
system("pause");
return 0;
}