#include<stdio.h>
//这道题不就是建两个树 然后顺带判断一下嘛 而树的结构是固定的
//因此只要在结构体里面下功夫就好了
typedef struct node
{
int k1;
int k2;
int left;
int right;
}node;
node pon[1008];
int K1[1008];
int kk = 0;
int flag;
void inorder(int root)//k1 搜索树
{
if(root!=-1)
{
inorder(pon[root].left);
K1[kk++] = pon[root].k1;
// printf ("%d ",pon[root].k1);
inorder(pon[root].right);
}
}
void pdk1()
{
for (int i = 1;i<kk;i++)
{
if (K1[i]<K1[i-1])
{
flag = 1;
}
}
}
void pdk2(int root)//判断最小堆 所有结点都比根节点大
{
if (root==-1) return;
int l = pon[root].left;
int r = pon[root].right;
if (pon[root].k2 > pon[l].k2 && l!=-1)
{
flag = 1;
return;
}
pdk2(l);
if (pon[root].k2 > pon[r].k2 && r!=-1)
{
flag = 1;
return;
}
pdk2(r);
}
int main()
{
int N;
scanf ("%d",&N);
int root = (N-1)*N/2;
for (int i = 0;i<N;i++)
{
int a,b,c,d;
scanf ("%d%d%d%d",&a,&b,&c,&d);
if (c!=-1) root-=c;
if (d!=-1) root-=d;
pon[i].k1 = a;
pon[i].k2 = b;
pon[i].left = c;
pon[i].right = d;
}
inorder(root);
pdk1();
pdk2(root);
if (!flag) printf ("YES");
else printf ("NO");
return 0;
}
就是这么自信,直接一遍过,测试都不带测的。
思路不难,就像上面说的一样,建立静态链表,然后再去操作一波,判断是否为二叉树,就用中序遍历,然后看看是否是非递减顺序,判断是否为最小堆,就只需要判断根节点和叶子结点的大小关系即可,然后再加上递归,即可遍历所有数据,前面需要特判一下,如果根结点为-1 就要退出来。设置一个全局变量用来处理就可以了。