分析
通过建立一棵二叉树,之后dfs判断是否符合要求:
- 根节点的k1值<左孩子k1值,根节点的k1值>右孩子k1值。
- 根节点的k2值<左孩子k1值,根节点的k1值<右孩子k2值。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
int id,k1,k2;
int left;
int right;
}V[1010];
set<int> s;
int fa[1010];
bool f;
void dfs(int u)
{
if(V[u].left==-1 && V[u].right==-1) return ;
if(V[u].left>=0){
if(V[u].k1<V[V[u].left].k1) f=1;
if(V[u].k2>V[V[u].left].k2) f=1;
dfs(V[u].left);
}
if(V[u].right>=0){
if(V[u].k1>V[V[u].right].k1) f=1;
if(V[u].k2>V[V[u].right].k2) f=1;
dfs(V[u].right);
}
}
int main() {
cin>>n;
for(int i=0;i<n;i++) fa[i]=i;
for(int i=0;i<n;i++)
{
s.insert(i);
int a,b,c,d; cin>>a>>b>>c>>d;
if(c>=0)fa[c]=i;
if(d>=0)fa[d]=i;
V[i].id=i;V[i].k1=a;V[i].k2=b;
if(!s.count(c)){
V[i].left=c;
V[c].id=c;
s.insert(c);
}
if(c==-1) V[i].left=-1;
if(!s.count(d)){
V[i].right=d;
V[d].id=d;
s.insert(d);
}
if(d==-1) V[i].right=-1;
}
int root;
for(int i=0;i<n;i++)
{
if(fa[i]==i)
{
root=i;
break;
}
}
dfs(root);
if(!f) puts("YES");
else puts("NO");
return 0;
}