A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:node
If we swap the left and right subtrees of every node, then the resulting tree is called theMirror Imageof 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.less
Each input file contains one test case. For each case, the first line contains a positive integerN(≤1000). ThenNinteger keys are given in the next line. All the numbers in a line are separated by a space.post
For each test case, first print in a lineYES
if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, orNO
if not. Then if the answer isYES
, 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.spa
7 8 6 5 7 10 8 11
YES 5 7 6 8 11 10 8
7 8 10 11 8 6 7 5
YES 11 8 10 7 5 6 8
7 8 6 8 5 10 9 11
NO
#include <cstdio> #include <algorithm> #include <vector> using namespace std; struct node { int data; node* lchild; node* rchild; }; node* newNode(int x) { node* root = new node; root -> data = x; root -> lchild = NULL; root -> rchild = NULL; return root; } void insert(node* &root , int x) { if (root == NULL) { root = newNode(x); return; } if (x < root -> data) insert(root -> lchild, x); else insert(root -> rchild, x); } //先序 void preOrder(node* root, vector<int>& vi) { if (root == NULL) return; vi.push_back(root -> data); preOrder(root -> lchild, vi); preOrder(root -> rchild, vi); } //鏡像先序 void preOrderMirror(node* root, vector<int>& vi) { if (root == NULL) return; vi.push_back(root -> data); preOrderMirror(root -> rchild, vi); preOrderMirror(root -> lchild, vi); } //後續遍歷 void postOrder(node* root, vector<int>& vi) { if (root == NULL) return; postOrder(root -> lchild, vi); postOrder(root -> rchild, vi); vi.push_back(root -> data); } // 鏡像樹後序 void postOrderMirror(node* root, vector<int>& vi) { if (root == NULL) return; postOrderMirror(root -> rchild, vi); postOrderMirror(root -> lchild, vi); vi.push_back(root -> data); } vector<int> origin, pre, preM, post, postM; int main() { int n, data; node* root = NULL; scanf("%d", &n); for (int i = 0; i < n; i ++) { scanf("%d", &data); origin.push_back(data); insert(root, data); } preOrder(root, pre); preOrderMirror(root, preM); postOrder(root, post); postOrderMirror(root, postM); if (origin == pre) { printf("YES\n"); for (int i = 0; i < post.size(); i ++) { printf("%d", post[i]); if ( i < post.size() - 1) printf(" "); } } else if (origin == preM) { printf("YES\n"); for (int i = 0; i < postM.size(); i ++) { printf("%d", postM[i]); if (i < postM.size() - 1) printf(" "); } } else { printf("NO\n"); } return 0; }