#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];
}
pat4-06 Data_sturcture 搜索树判断
最新推荐文章于 2020-11-25 11:01:51 发布