//写得太冗长,但好歹是过了,思路比较清晰~~~之前一直有一两个case不过
#include<iostream>
using namespace std;
#define MAX 1005
int prelist[MAX];
class Node
{
public:
int data;Node* left,*right;
Node(int data)
{
this->data=data;
this->left=this->right=NULL;
}
};
bool isBST(int start, int n)
{
if(n<=1) return true;
int elem=prelist[start];
int i;
for(i=1;i<n;i++)
{
if(prelist[start+i]>=elem) break;
}
int left_len=i-1;
for(;i<n;i++)
{
if(prelist[start+i]<elem) return false;
}
if(isBST(start+1,left_len)&&isBST(start+left_len+1,n-left_len-1))
return true;
else
return false;
}
bool ismBST(int start, int n)
{
if(n<=1) return true;
int elem=prelist[start];
int i;
for(i=1;i<n;i++)
{
if(prelist[start+i]<elem) break;
}
int left_len=i-1;
for(;i<n;i++)
{
if(prelist[start+i]>=elem) return false;
}
if(ismBST(start+1,left_len)&&ismBST(start+left_len+1,n-left_len-1))
return true;
else
return false;
}
Node* build_BST(int start,int n)
{
Node *p=NULL;
if(n>0)
{
int elem=prelist[start];
p=new Node(elem);
int i=1;
for(i=1;i<n;i++)
{
if(elem<=prelist[start+i]) break;
}
p->left=build_BST(start+1,i-1);
p->right=build_BST(start+i,n-i);
}
return p;
}
Node* build_mBST(int start,int n)
{
Node *p=NULL;
if(n>0)
{
int elem=prelist[start];
p=new Node(elem);
int i=1;
for(i=1;i<n;i++)
{
if(elem>prelist[start+i]) break;
}
p->left=build_mBST(start+1,i-1);
p->right=build_mBST(start+i,n-i);
}
return p;
}
bool first=true;
void postorder(Node* p)
{
if(p->left!=NULL) postorder(p->left);
if(p->right!=NULL) postorder(p->right);
if(first)
{
first=false;cout<<p->data;
}
else
{
cout<<" "<<p->data;
}
}
int main()
{
int n;cin>>n;
for(int i=0;i<n;i++)
{
cin>>prelist[i];
}
if( isBST(0,n))
{
cout<<"YES\n";
Node *root=build_BST(0,n);
postorder(root);
}
else if(ismBST(0,n))
{
cout<<"YES\n";
Node *root=build_mBST(0,n);
postorder(root);
}
else
cout<<"NO\n";
}
PAT 1043. Is It a Binary Search Tree (25)
最新推荐文章于 2024-08-08 14:28:04 发布