【题解】【PAT甲】 1135 Is It A Red-Black Tree (30 分)(红黑树)

该篇博客主要讨论了如何判断一个给定的二叉搜索树是否符合红黑树的性质。通过先序序列,博主提出了一个解题思路,即通过两个深度优先搜索(DFS)分别检查红黑树的性质3和4。性质3确保红色节点的子节点为黑色,性质4保证从任意节点到其叶子节点的路径上黑色节点数量相同。博主提供了一个C++代码实现,通过先构建二叉树,然后进行DFS判断,最终输出结果是‘Yes’或‘No’,表示是否满足红黑树的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

 PTA | 程序设计类实验辅助教学平台

题目描述

There is a kind of balanced binary search tree named red-black tree in the data structure. It has the following 5 properties:

  • (1) Every node is either red or black.
  • (2) The root is black.
  • (3) Every leaf (NULL) is black.
  • (4) If a node is red, then both its children are black.
  • (5) For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.

For example, the tree in Figure 1 is a red-black tree, while the ones in Figure 2 and 3 are not.

rbf1.jpg

rbf2.jpg

rbf3.jpg

Figure 1Figure 2Figure 3

For each given binary search tree, you are supposed to tell if it is a legal red-black tree.

Input Specification:

Each input file contains several test cases. The first line gives a positive integer K (≤30) which is the total number of cases. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the preorder traversal sequence of the tree. While all the keys in a tree are positive integers, we use negative signs to represent red nodes. All the numbers in a line are separated by a space. The sample input cases correspond to the trees shown in Figure 1, 2 and 3.

Output Specification:

For each test case, print in a line "Yes" if the given tree is a red-black tree, or "No" if not.

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.叶子结点(为NULL)为黑

3.如果一个节点为红结点,它的儿子结点必须为黑节点

4.任意一个结点到左右子树的叶子结点经过的黑节点数目必须相同

解题思路

 一开始写了一个dfs结果跑不起来

可以将一个dfs拆分成两个dfs,一个用来判断条件3,一个判断条件4

条件3没啥好说的,主要是条件4

遍历每一个节点,每个节点的左右子树的黑节点高度必须相等(?也没理解这句话啥意思)

题解

#include<bits/stdc++.h>
using namespace std;
struct Node{
	int val;
	int flag=0;
	int num=0;
	struct Node* left;
	struct Node* right;
	int sub=-1;
};
//0 黑
//1 红 
Node* insert(Node* root,int val,int flag){
	if(root==NULL){
		root=new Node();
		root->left=NULL;
		root->right=NULL;
		root->val=val;
		root->flag=flag;
	}
	else{
		if(val>root->val){
			root->right=insert(root->right,val,flag);
		}
		else{
			root->left=insert(root->left,val,flag);
		}
	}
	return root;
}
vector<Node*> v;
bool dfs1(Node* root,int flag){
	if(root==NULL)	return true;
	if(flag==1&&root->flag==1)	return false;
	return dfs1(root->left,root->flag)&&dfs1(root->right,root->flag);
}
int getNum(Node* root){
	if(root==NULL)	return 1;
	int l=getNum(root->left);
	int r=getNum(root->right);
	return (root->flag==0)?min(l,r)+1:min(l,r);
}
bool dfs2(Node* root){
	if(root==NULL)	return true;
	int left=getNum(root->left);
	int right=getNum(root->right);
	if(left!=right)	return false;
	return dfs2(root->left)&&dfs2(root->right);
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		scanf("%d",&n);
		int data;
		Node* root;
		int flag;
		for(int i=0;i<n;i++){
			scanf("%d",&data);
			if(data>=0)	flag=0;		//黑 
			else	flag=1;			//红 
			if(i==0){
				root=new Node();
				root->left=NULL;
				root->right=NULL;
				root->val=data;
				root->flag=flag;
			}
			else
				root=insert(root,abs(data),flag);
		}
		if(root->flag==0&&dfs1(root,0)&&dfs2(root))	cout<<"Yes"<<endl;
		else	cout<<"No"<<endl;	 
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值