需要递归的去求解 来保证结果正确 如果直接DFS可能不行
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
node* left;
node* right;
};
node* insert(node*& root,int data)
{
if(root == NULL)
{
root = new node;
root -> data = data;
root -> left = root -> right = NULL;
return root;
}
if(abs(data) <= abs(root -> data))
{
root -> left = insert(root -> left,data);
}
else
{
root -> right = insert(root -> right,data);
}
return root;
}
void inorder(node* root)
{
if(root == NULL)
{
return ;
}
inorder(root -> left);
printf(" %d",root -> data);
inorder(root -> right);
}
int getheight(node* root)
{
if(root == NULL)
{
return 0;
}
int l = getheight(root -> left);
int r = getheight(root -> right);
if(root -> data > 0)
{
return max(l,r) + 1;
}
else
{
return max(l,r);
}
}
bool judge(node* root)
{
if(root == NULL)
{
return true;
}
int l = getheight(root -> left);
int r = getheight(root -> right);
if(l != r)
{
return false;
}
return judge(root->left) && judge(root -> right);
}
bool judge2(node* root)
{
if(root == NULL)
{
return true;
}
if(root -> data < 0)
{
if(root -> left != NULL && root -> left -> data < 0)
{
return false;
}
if(root -> right != NULL && root -> right -> data < 0)
{
return false;
}
}
return judge2(root -> left) && judge2(root -> right);
}
//递归的去判断是否是红黑树
//递归的去判断两边黑色的个数 保证两边黑色结点的个数是相同的
//递归的去判断一个结点如果是红色,那么他的子结点是否都是黑色
int main(void)
{
freopen("pat0314/in.txt","r",stdin);
int n;
cin>>n;
for(int i = 0;i<n;i++)
{
int k;
cin>>k;
node* root = NULL;
for(int j = 0;j<k;j++)
{
int num;
cin>>num;
root = insert(root,num);
}
// inorder(root);
// cout<<endl;
// cout<<judge2(root)<<" "<<judge(root)<<" "<<root->data<<endl;
if(judge2(root) && judge(root) && root -> data > 0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}```