[C++] PAT 1135 Is It A Red-Black Tree (30分)

该博客介绍了PAT 1135题目的解题思路,主要涉及红黑树的性质验证。通过样例输入和输出展示了如何判断给定的二叉树是否符合红黑树的条件,包括根节点颜色、黑色节点数量的一致性以及红色节点子节点的颜色等关键规则。
摘要由CSDN通过智能技术生成

在这里插入图片描述

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值