7-31 笛卡尔树 (25 分)

二叉搜索树的判断方式和小根堆的判断方式

#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cctype>
#include <climits>
#include <unordered_map>
#include <map>
#include <cstring>
using namespace std;
const int N = 1005;
int ind[N];
struct DescartesTree{
	int k1, k2, l, r;
}E[N];
bool judge(int r, int maxx, int minn){
	if(r == -1) return true;
	int k1 = E[r].k1, k2 = E[r].k2;
	if(k1 >= maxx || k1 <= minn) return false;
	if(E[r].l != -1) {
		int ll = E[r].l;
		if(E[ll].k2 <= k2) return false;
	}
	if(E[r].r != -1){
		int rr = E[r].r;
		if(E[rr].k2 <= k2) return false;
	}
	return judge(E[r].l, k1, minn) && judge(E[r].r, maxx, k1);
}
int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		scanf("%d %d %d %d",&E[i].k1, &E[i].k2, &E[i].l, &E[i].r);
		if(E[i].l != -1) ind[E[i].l]++;
		if(E[i].r != -1) ind[E[i].r]++;
	}
	int root;
	for(int i = 0; i < n; i++){
		if(!ind[i]){
			root = i;
			break;
		}
	}
	if(judge(root, INT_MAX, INT_MIN)) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值