A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, first print in a line "YES" if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or "NO" if not. Then if the answer is "YES", print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
拜托,一个“&”没写硬是折腾了一下午,指针神马的真的是生人勿进,有测试点通不过就再说了,exhuasted……
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
#define N 1001
typedef struct Node
{
int id;
struct Node *left;
struct Node *right;
}Node;
vector<int> num;//存放初始序列
vector<int> pre;//存放前序序列
vector<int> prem;//存放前序镜像序列
vector<int> post;
vector<int> postm;
int n;
void Postm (Node * root,vector<int> & vi);
void Post (Node * root,vector<int> & vi);
void Pre (Node * root,vector<int>& vi);
void Prem (Node * root,vector<int>& vi);
void Insert (Node * &root,int n);
int main ()
{
int temp,i;
scanf("%d",&n);
Node * root=NULL;
for( i=0;i<n;i++)
{
scanf("%d",&temp);
num.push_back(temp);
Insert(root,temp);
}
//构造完成
//先看是否是前序序列
Pre(root,pre);
if( num==pre)//是前序序列
{
printf("YES\n");
Post(root,post);
printf("%d",post[0]);
for( i=1;i<post.size();i++) printf(" %d",post[i]);
printf("\n");
}
else
{
Prem(root,prem);//是否是前序镜像序列;
if( prem==num)
{
printf("YES\n");
Postm(root,postm);
printf("%d",postm[0]);
for( i=1;i<postm.size();i++) printf(" %d",postm[i]);
printf("\n");
}
else printf("No\n");
}
system("pause");
return 0;
}
void Postm (Node * root,vector<int> & vi)
{
if( root==NULL) return;
Postm(root->right,vi);
Postm(root->left,vi);
vi.push_back(root->id);
}
void Post (Node * root,vector<int>& vi)
{
if( root==NULL) return;
Post(root->left,vi);
Post(root->right,vi);
vi.push_back(root->id);
}
void Prem (Node * root,vector<int>& vi)
{
if( root==NULL) return;
vi.push_back(root->id);
Prem( root->right,vi);
Prem( root->left,vi);
}
void Pre (Node * root,vector<int>& vi)
{
if( root==NULL) return;
vi.push_back(root->id);
Pre( root->left,vi);
Pre( root->right,vi);
}
void Insert (Node * &root,int n)
{
if( root==NULL)
{
root=new Node;
root->id=n;
root->left=NULL;
root->right=NULL;
return;
}
if( n<root->id) Insert(root->left,n);
else Insert(root->right,n);
}
1043. Is It a Binary Search Tree
原文:http://blog.csdn.net/lchinam/article/details/44082871