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