这个主要是对二叉树的遍历,并不困难
/*
* data :2020.7.8
* theme:路径
*/
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 1005
int judge[N];
int cont = 0;
struct node
{
int k1;
int k2;
int left;
int right;
int parent;
};
struct node *p;
int gethead(int n)
{
for (int i = 0; i < n; i++)
{
if (p[i].parent == -1)
{
return i;
}
}
}
void judge_k1(int head)
{
//先序遍历
if (head != -1)
{
judge_k1(p[head].left);
judge[cont++] = p[head].k1;
judge_k1(p[head].right);
}
}
int judge_all(int n)
{
for (int i = 0; i < n - 1; i++)
{
if (judge[i] > judge[i + 1])
{
return 0;
}
}
return 1;
}
int judge_k2(int head)
{
//
if (p[head].left != -1)
{
if (p[p[head].left].k2 <= p[head].k2)
{
return 0;
}
if(judge_k2(p[head].left)==0)
return 0;
}
if (p[head].right != -1)
{
if (p[head].k2 >= p[p[head].right].k2)
{
return 0;
}
if(judge_k2(p[head].right)==0){
return 0;
}
}
return 1;
}
int main()
{
int number;
int head = 0;
int flag = 0;
int k1, k2, left, right;
cin >> number;
p = new struct node[number + 1];
for (int i = 0; i < number; i++)
{
p[i].parent = -1;
}
for (int i = 0; i < number; i++)
{
cin >> k1 >> k2 >> left >> right;
//输入信息
p[i].k1 = k1;
p[i].k2 = k2;
p[i].left = left;
p[i].right = right;
if (left != -1)
{
p[left].parent = i;
}
if (right != -1)
{
p[right].parent = i;
}
}
head = gethead(number);
judge_k1(head);
if (judge_all(number) == 1)
{
flag++;
}
//判断是不是k1
if (judge_k2(head) == 1)
{
flag++;
}
if (flag == 2)
{
cout << "YES" << endl;
}
else
cout << "NO" << endl;
}