PAT1135 Red And Black Tree

版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_41162823/article/details/82413793

原题链接:PAT1135

解析:以前只是听说过红黑树,但是这次是第一次接触红黑树,如果考试时出现这种没看过的数据结构,挺麻烦的。判断一个二叉树是否为红黑树有三个条件:

  1. 根节点是否为黑色
  2. 红色节点的子节点是否为黑色
  3. 每条路径上的黑色节点数量是否相同

错误报告:主要是建树方面出了问题,我写的其他地方思路以及形式都和题解一样,只是我想用数组存树,带来了很多麻烦,最终也导致几个点一直过不去,改用指针之后就过了。

代码实例:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct Node{
	int val;
	Node *ls,*rs;
};
Node *BuildTree(Node *root,int val){
	if(root == NULL){
		root = new Node();
		root->val = val;
		root->ls = NULL;
		root->rs = NULL;
		return root;
	}
	if(abs(val) <= abs(root->val))
		root->ls = BuildTree(root->ls,val);
	else
		root->rs = BuildTree(root->rs,val);
	return root;
}
int getcolor(Node* root){
	return root->val;
}
bool judge1(Node *root){
	if(root == NULL)	return true;
	if(root->val < 0){
		if(root->ls != NULL && getcolor(root->ls) < 0)	return false;
		if(root->rs != NULL && getcolor(root->rs) < 0)	return false;
	}
	return judge1(root->ls) && judge1(root->rs);
}
int getnum(Node *root){
	if(root == NULL)	return 0;
	int l = getnum(root->ls);
	int r = getnum(root->rs);
	return root->val > 0 ? max(l,r)+1:max(l,r);
}
bool judge2(Node *root){
	if(root == NULL) 	return true;
	if(getnum(root->ls) == getnum(root->rs))
		return judge2(root->ls) && judge2(root->rs);
	else return false;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
		int n,val;
		Node *root = NULL;
		scanf("%d",&n);
		for(int i = 0;i < n;i++){
			scanf("%d",&val);
			root = BuildTree(root,val);
		}
		bool flag = true;
		if(root->val < 0)	flag = false;
		if(flag && !judge1(root))	flag = false;
		if(flag && !judge2(root))	flag = false;
		if(flag)	puts("Yes");
		else puts("No");
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_41162823/article/details/82413793