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