1135 Is It A Red-Black Tree

题目

题意: 给一棵二叉搜索树的前序遍历,判断它是否为红黑树,是输出Yes,否则输出No

1.根结点是否为黑色
2.如果一个结点是红色,它的孩子节点是否都为黑色
3.从任意结点到叶子结点的路径中,黑色结点的个数是否相同

tip:建树判断

#include<iostream>
using namespace std;
struct node {
	int val;
	struct node *left,*right;
};
int k,n;
struct node* createRBT(struct node* root,int val) {
	if(root==NULL) {
		root=new node();
		root->val=val;
		root->left=root->right=NULL;
	} else if(abs(root->val)>=abs(val))
		root->left=createRBT(root->left,val);
	else root->right=createRBT(root->right,val);
	return root;
}
int getlen(struct node* root) {
	if(root==NULL)
		return 0;
	return root->val<0?max(getlen(root->left),getlen(root->right)):max(getlen(root->left),getlen(root->right))+1;
}
bool judge1(struct 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 judge1(root->left)&&judge1(root->right);
}
bool judge2(struct node* root) {//判断路径上黑色结点个数是否一致 
	if(root==NULL)
		return true;
	int l=getlen(root->left);
	int r=getlen(root->right);
	if(l!=r)
		return false;
	return judge2(root->left)&&judge2(root->right);
}
int main() {
	cin>>k;
	for(int i=0; i<k; ++i) {
		cin>>n;
		struct node* root=NULL;
		int first;
		for(int j=0; j<n; ++j) {
			int t;
			cin>>t;
			if(j==0)
				first=t;
			root=createRBT(root,t);
		}
		if(first<0||!judge1(root)||!judge2(root))
			cout<<"No\n";
		else cout<<"Yes\n";
	}
	return 0;
}

 

相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页