1135. Is It A Red-Black Tree (30)

https://www.patest.cn/contests/pat-a-practise/1135

#include <bits/stdc++.h>
using namespace std;
vector<int> pre,ino;
struct TreeNode
{
	int val;
	TreeNode *left,*right;
	TreeNode(int v=0,TreeNode *l=NULL,TreeNode *r=NULL):val(v),left(l),right(r){}
};
TreeNode *build(int preL,int preR,int inoL,int inoR)
{
	if(preL>preR) return NULL;
	int e=pre[preL],idx=inoL,pdx=preL;
	while(idx<=inoR&&ino[idx]!=e) ++idx,++pdx;
	TreeNode *r=new TreeNode(e);
	r->left=build(preL+1,pdx,inoL,idx-1);
	r->right=build(pdx+1,preR,idx+1,inoR);
	return r;
}
bool cmp(const int &a,const int &b){
	return abs(a)<abs(b);
}
bool help(TreeNode *r){
	return !r||r->val>0;
}
bool checkrednode(TreeNode *r){
	return help(r->left)&&help(r->right);
}
int isrbTree(TreeNode *r,bool &ret,bool &res)
{
	if(r)
	{
		int lbc=isrbTree(r->left,ret,res);
		int rbc=isrbTree(r->right,ret,res);
		if(r->val<0&&!checkrednode(r)) res=0;
		if(lbc!=rbc) ret=0;
		return r->val>0?lbc+1:lbc;
	}
	return 1;
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int m;
		cin>>m;
		pre.resize(m);
		for(int i=0;i<m;++i) cin>>pre[i];
		ino=pre;
		sort(ino.begin(),ino.end(),cmp);
		TreeNode *r=build(0,m-1,0,m-1);
		bool ret=1,res=1;
		isrbTree(r,ret,res);
		r->val>0&&res&&ret?cout<<"Yes\n":cout<<"No\n";
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值