pat4-06 Data_sturcture 搜索树判断

#include<iostream>

using namespace std;

struct Node
{
	int data;
	Node *left,*right;
};
bool LessTree(int *a,int start,int end,Node *&tree)
{
	if(start==end)
	{
		tree=new Node;
		tree->data=a[start];
		tree->left=tree->right=0;
		return true;
	}
	tree=new Node;
	tree->data=a[start];
	tree->left=tree->right=0;
	int i=1;
	while(a[start+i]<a[start]&&start+i<=end) ++i;
	if(i!=1) LessTree(a,start+1,start+i-1,tree->left);
	int i_tmp=i;
	while(start+i<=end)
	{
		if(a[start+i]<a[start]) return false;
		++i;
	}
	if(start+i_tmp<=end) return LessTree(a,start+i_tmp,end,tree->right);
}

bool GreaterTree(int *a,int start,int end,Node *&tree)
{
	if(start==end)
	{
		tree=new Node;
		tree->data=a[start];
		tree->left=tree->right=0;
		return true;
	}
	tree=new Node;
	tree->data=a[start];
	tree->left=tree->right=0;
	int i=1;
	while(a[start+i]>=a[start]&&start+i<=end) ++i;
	if(i!=1) GreaterTree(a,start+1,start+i-1,tree->left);
	int i_tmp=i;
	while(start+i<=end)
	{
		if(a[start+i]>=a[start]) return false;
		++i;
	}
	if(start+i_tmp<=end) return GreaterTree(a,start+i_tmp,end,tree->right);
}
void PostOrder(Node *tree,int *a)
{
	static int i=0;
	if(tree)
	{
		PostOrder(tree->left,a);
		PostOrder(tree->right,a);
		a[i++]=tree->data;
	}
}
void FreeTree(Node *tree)
{
	if(tree)
	{
		FreeTree(tree->left);
		FreeTree(tree->right);
		delete tree;
		tree=0;
	}
}
int main()
{
	int n;
	cin>>n;
	int a[n];
	for(int i=0;i<n;++i)
	{
		cin>>a[i];
	}
	Node *tree=0;
	if(!LessTree(a,0,n-1,tree))
	{
		if(tree) FreeTree(tree);
		if(!GreaterTree(a,0,n-1,tree))
		{
			cout<<"NO\n";
			return 0;
		}
	}
	cout<<"YES\n";
	PostOrder(tree,a);
	cout<<a[0];
	for(int i=1;i<n;++i)
		cout<<' '<<a[i];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值