二叉搜索树的判断方式和小根堆的判断方式
#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;
}