5-31 笛卡尔树 (25分)

5-31 笛卡尔树   (25分)

笛卡尔树是一种特殊的二叉树,其结点包含两个关键字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

输出样例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

输出样例2:

NO
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:DS课程组
  • 单位:浙江大学

http://pta.patest.cn/pta/test/15/exam/4/question/858

#include <cstdio>  
#include <sstream>  
#include <cstring>  
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

#define  N 1005

int n ;

struct data
{
	int k1  , k2 ;
	int left , right ;
};

data dt[N] ;

int fa[N] ;
int find(int x)
{
	if(x == fa[x])
		return x ;
	return fa[x] = find(fa[x] );
}
void merg(int x , int y)
{
	fa[find(y)] = find(x) ;
}

typedef struct node
{
	int k1 , k2 ;
	struct node *left , *right ;
	node(int _k1 = -1  , int _k2 = -1)
	{
		k1 = _k1 ;
		k2 = _k2 ;
		left = NULL ;
		right = NULL ;
	}
}Bnode ;

Bnode* createTree(Bnode* root , int num)
{
	if(num == -1)
		return NULL ;
	root = new node(dt[num].k1 , dt[num].k2) ;
	root->left = createTree(root->left , dt[num].left) ;
	root->right = createTree(root->right , dt[num].right) ;
	return root ;
}

vector<int> vin;

void inOrder(Bnode* root)
{
	if(root != NULL)
	{
		inOrder(root->left);
		vin.push_back(root->k1) ;
		inOrder(root->right);
	}
}

bool isBsTreee(Bnode* root)
{
	vin.clear();
	inOrder(root);
	int i ;
	for(i = 1 ; i < n ; i++)
	{
		if(vin[i] <= vin[i-1])
			return false ;
	}
	return true ;
}

bool isXiaoDui(Bnode* root)
{
	if(root == NULL)
		return true ;
	if(root->left == NULL && root->right == NULL)
		return true ;
	if(root->left != NULL && root->right == NULL)
	{
		if(root->left->k2 > root->k2)
			return true ;
		return false ;
	}
	if(root->left == NULL && root->right != NULL)
	{
		if(root->right->k2 > root->k2)
			return true ;
		return false ;
	}
	bool flag1 = isXiaoDui(root->left) ;
	bool flag2 = isXiaoDui(root->right) ;
	if(flag1 && flag2)
	{
		return true ;
	}
	return false ;
}

int main()
{
    //freopen("in.txt", "r", stdin);
	while( scanf("%d", &n) != EOF)
	{
		int i ;
		for(i = 0 ;i < n ; i++)
		{
			fa[i] = i ;
		}
		for(i = 0 ;i < n ; i++)
		{
			scanf("%d%d%d%d",&dt[i].k1,&dt[i].k2,&dt[i].left,&dt[i].right);
			if(dt[i].left != -1)
			{
				if(find(i) != find(dt[i].left) )
				{
					merg(i,dt[i].left) ;
				}
			}
			if(dt[i].right != -1)
			{
				if(find(i) != find(dt[i].right) )
				{
					merg(i,dt[i].right) ;
				}
			}
		}
		int rNum = find(0);
		Bnode* root = NULL ;
		root = createTree(root ,  rNum);
		
		if(isBsTreee(root))
		{
			if(isXiaoDui(root))
				printf("YES\n");
			else
				printf("NO\n") ;
		}else{
			printf("NO\n") ;
		}
	}
	return 0 ;
}


你可能感兴趣的:(5-31 笛卡尔树 (25分))