http://pat.zju.edu.cn/contests/pat-a-practise/1043
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.
Sample Input 1:7 8 6 5 7 10 8 11Sample Output 1:
YES 5 7 6 8 11 10 8Sample Input 2:
7 8 10 11 8 6 7 5Sample Output 2:
YES 11 8 10 7 5 6 8Sample Input 3:
7 8 6 8 5 10 9 11Sample Output 3:
NO
#include <iostream> #include <cstdio> #include <vector> using namespace std; int loc; struct Node{ Node *lchild; Node *rchild; int c; }Tree[2000]; Node *creat(){ Tree[loc].lchild = Tree[loc].rchild = NULL; return &Tree[loc++]; } Node *insert1(Node *T, int x){ if (T == NULL){ T = creat(); T->c = x; } else{ if (x < T->c) T->lchild = insert1(T->lchild, x); else T->rchild = insert1(T->rchild, x); } return T; } Node *insert2(Node *T, int x){ if (T == NULL){ T = creat(); T->c = x; } else{ if (x < T->c) T->rchild = insert2(T->rchild, x); else T->lchild = insert2(T->lchild, x); } return T; } void preOrder(Node *T, vector<int> &v){ v.push_back(T->c); if (T->lchild != NULL) preOrder(T->lchild, v); if (T->rchild != NULL) preOrder(T->rchild, v); } void postOrder(Node *T, vector<int> &v){ if (T->lchild != NULL) postOrder(T->lchild, v); if (T->rchild != NULL) postOrder(T->rchild, v); v.push_back(T->c); } int main(){ int n; vector<int> v1, v2, v3, v; scanf("%d", &n); for (int i = 0; i < n; i++){ int x; scanf("%d", &x); v1.push_back(x); } loc = 0; Node *T1 = NULL, *T2 = NULL; for (int i = 0; i < n; i++){ T1 = insert1(T1, v1[i]); T2 = insert2(T2, v1[i]); } preOrder(T1, v2); preOrder(T2, v3); if (v2 != v1 && v3 != v1){ printf("NO\n"); return 0; } else{ printf("YES\n"); if (v2 == v1){ postOrder(T1, v); for (int i = 0; i < n; i++) printf("%d%c", v[i], ((i - n + 1) ? ' ' : '\n')); } else if (v3 == v1){ postOrder(T2, v); for (int i = 0; i < n; i++) printf("%d%c", v[i], ((i - n + 1) ? ' ' : '\n')); } } return 0; }