题目链接:http://www.patest.cn/contests/ds/4-09
笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字满足优先队列(不妨设为最小堆)的顺序要求,即该结点的K2值比其子树中所有结点的K2值小。给定一棵二叉树,请判断该树是否笛卡尔树。
输入格式说明:
输入首先给出正整数N(<=1000),为树中结点的个数。随后N行,每行给出一个结点的信息,包括:结点的K1值、K2值、左孩子结点编号、右孩子结点编号。设结点从0~(N-1)顺序编号。若某结点不存在孩子结点,则该位置给出-1。
输出格式说明:
输出YES如果该树是一棵笛卡尔树;否则输出NO。
样例输入与输出:
| 序号 | 输入 | 输出 |
| 1 |
6 8 27 5 1 9 40 -1 -1 10 20 0 3 12 21 -1 4 15 22 -1 -1 5 35 -1 -1 |
YES |
| 2 |
6 8 27 5 1 9 40 -1 -1 10 20 0 3 12 11 -1 4 15 22 -1 -1 50 35 -1 -1 |
NO |
| 3 |
7 8 27 5 1 9 40 -1 -1 10 20 0 3 12 22 -1 4 15 21 6 -1 5 35 -1 -1 13 23 -1 -1 |
NO |
| 4 |
6 8 27 5 1 9 40 -1 -1 10 20 0 3 12 21 -1 4 11 22 -1 -1 5 35 -1 -1 |
NO |
| 5 |
9 11 5 3 -1 15 3 4 7 5 2 6 0 6 8 -1 -1 9 6 -1 8 10 1 2 1 2 4 -1 -1 20 7 -1 -1 12 9 -1 -1 |
NO |
| 6 |
1 1 1 -1 -1 |
YES |
笛卡尔树的中序遍历应为一升序的序列!
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1017;
int tag[maxn];
typedef struct
{
int k1;
int k2;
int L;
int R;
}Node;
vector<int>a;
vector<Node>b;
void Mid_order(Node T)//中序遍历
{
if(T.L != -1)
{
Mid_order(b[T.L]);
}
a.push_back(T.k1);
if(T.R != -1)
{
Mid_order(b[T.R]);
}
}
int is_dkr(Node T)
{
if(T.L==-1 && T.R==-1)
return 1;
else if(T.L!=-1 && T.R==-1)
{
if(b[T.L].k2 > T.k2)
return is_dkr(b[T.L]);
else
return 0;
}
else if(T.L==-1 && T.R!=-1)
{
if(b[T.R].k2 > T.k2)
return is_dkr(b[T.R]);
else
return 0;
}
else if(T.L!=-1 && T.R!=-1)
{
if(b[T.L].k2 > T.k2 && b[T.R].k2 > T.k2)
return is_dkr(b[T.L]) && is_dkr(b[T.R]);
else
return 0;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i, j;
memset(tag,0,sizeof(tag));
a.clear();
b.clear();
Node c;
for(i = 0; i < n; i++)
{
scanf("%d%d%d%d",&c.k1,&c.k2,&c.L,&c.R);
if(c.L >= 0)
{
tag[c.L] = 1;
}
if(c.R >= 0)
{
tag[c.R] = 1;
}
b.push_back(c);
}
int root_node = 0;
for(i = 0; i < b.size(); i++)
{
if(!tag[i])
{
root_node = i;//根节点
break;
}
}
Mid_order(b[root_node]);
int flag = 0;
for(i = 1; i < a.size(); i++)
{
if(a[i] <= a[i-1])
{
flag = 1;
break;
}
}
if(flag)
{
printf("NO\n");
continue;
}
if(!is_dkr(b[root_node]))
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
return 0;
}原文地址:http://blog.csdn.net/u012860063/article/details/41407581