#include<bits/stdc++.h>
using namespace std;
struct Node{
int data;
Node* left;
Node* right;
Node(){
left=NULL;right=NULL;
}
};
bool cmp(int a,int b){
return a>b;
}
vector<int> pre,in,pos;
Node* judge1_build(int prel,int prer,int inl,int inr,int &flag){
if(prel>prer) return NULL;
Node* root=new Node;
root->data=pre[prel];
int k;
for(int i=inl;i<=inr;i++){
if(in[i]==pre[prel]){
k=i;break;
}
}
int numleft=k-inl;
int numright=inr-k;
for(int i=prel+1;i<=prel+numleft;i++){
if(pre[i]>=root->data){
flag=1;break;
}
}
for(int i=prel+numleft+1;i<=prer;i++){
if(pre[i]<root->data){
flag=1;break;
}
}
if(flag==1) return NULL;
root->left=judge1_build(prel+1,prel+numleft,inl,k-1,flag);
root->right=judge1_build(prel+numleft+1,prer,k+1,inr,flag);
return root;
}
Node* judge2_build(int prel,int prer,int inl,int inr,int &flag){
if(prel>prer) return NULL;
Node* root=new Node;
root->data=pre[prel];
int k;
for(int i=inr;i>=inl;i--){
if(in[i]==pre[prel]){
k=i;break;
}
}
int numleft=k-inl;
int numright=inr-k;
for(int i=prel+1;i<=prel+numleft;i++){
if(pre[i]<root->data){
flag=1;break;
}
}
for(int i=prel+numleft+1;i<=prer;i++){
if(pre[i]>=root->data){
flag=1;break;
}
}
if(flag==1) return NULL;
root->left=judge2_build(prel+1,prel+numleft,inl,k-1,flag);
root->right=judge2_build(prel+numleft+1,prer,k+1,inr,flag);
return root;
}
void postra1(Node* root){
if(root==NULL) return;
postra1(root->left);
postra1(root->right);
pos.push_back(root->data);
}
void postra2(Node* root){
if(root==NULL) return;
postra2(root->left);
postra2(root->right);
pos.push_back(root->data);
}
int main()
{
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
int n;
cin>>n;pre.resize(n);
for(int i=0;i<n;i++){
cin>>pre[i];
}
in=pre;
sort(in.begin(),in.end());
int flag=0;
Node* root;
if(pre[1]<pre[0]){
root=judge1_build(0,n-1,0,n-1,flag);
if(flag==1) cout<<"N0";
else{
postra1(root);
}
}else{
sort(in.begin(),in.end(),cmp);
root=judge2_build(0,n-1,0,n-1,flag);
if(flag==1) cout<<"N0";
else{
postra2(root);
}
}
if(flag!=1){
cout<<"YES"<<endl;
for(int i=0;i<pos.size();i++){
if(i==0) cout<<pos[i];
else cout<<' '<<pos[i];
}
}
return 0;
}
当根节点只有左子树或右子树的情况时在这段代码还没办法通过,目前这段代码22分,剩下三分应该就是刚才那种情况,因为这里判断镜像与否的条件时第二个节点值与第一个节点值的大小判断,根节点如果只有左子树或者右子树的时候有点麻烦,待解决......
这里在建树的时候判断子树节点值与根节点的关系来进行判断是否符合BST特征,传一个flag来进行判断。
#include<bits/stdc++.h>
using namespace std;
struct Node{
int data;
Node* left;
Node* right;
};
int n;
vector<int> pre,mipre,pos,mipos;
void build(Node* &root,int num){
if(root==NULL){
root=new Node;
root->data=num;
root->left=root->right=NULL;return;
}
if(num<root->data){
build(root->left,num);
}else{
build(root->right,num);
}
}
void postra(Node* root){
if(root==NULL) return;
postra(root->left);
postra(root->right);
pos.push_back(root->data);
}
void mipostra(Node* root){
if(root==NULL) return;
mipostra(root->right);
mipostra(root->left);
mipos.push_back(root->data);
}
void pretra(Node* root){
if(root==NULL) return;
pre.push_back(root->data);
pretra(root->left);
pretra(root->right);
}
void mipretra(Node* root){
if(root==NULL) return;
mipre.push_back(root->data);
mipretra(root->right);
mipretra(root->left);
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n;Node* root=NULL;vector<int> initial;
for(int i=0;i<n;i++){
int temp;cin>>temp;initial.push_back(temp);
build(root,temp);
}
pretra(root);
mipretra(root);
postra(root);
mipostra(root);
if(pre==initial){
cout<<"YES"<<endl;
for(int i=0;i<n;i++){
if(i==0) cout<<pos[i];
else cout<<' '<<pos[i];
}
}else if(mipre==initial){
cout<<"YES"<<endl;
for(int i=0;i<n;i++){
if(i==0) cout<<mipos[i];
else cout<<' '<<mipos[i];
}
}else{
cout<<"NO"<<endl;
}
return 0;
}
后面这段代码可以AC,考察BST建树