标签:
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
本题先判断是否的mirror BST,然后分别构造出相应的搜索树,分别对其进行中序和后序遍历。如果其为BST的话,那么其中序遍历的序列因为递增序列,mirror BST为递减序列,以此来判断
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 struct Node 7 { 8 int value; 9 Node* left; 10 Node* right; 11 }; 12 13 int sequence[1000]; 14 vector<int> inSequence; 15 vector<int> postSequence; 16 bool isMirror = false; 17 18 Node* ConstrutTree(int left, int right) 19 { 20 if (left == right) 21 return nullptr; 22 23 Node* root = new Node; 24 root->value = sequence[left]; 25 int index; 26 if (isMirror) //mirror BST 27 { 28 for (index = left + 1; index < right; index++) 29 if (sequence[index] < sequence[left]) 30 break; 31 } 32 else //BST 33 { 34 for (index = left + 1; index < right; index++) 35 if (sequence[index] >= sequence[left]) 36 break; 37 } 38 root->left = ConstrutTree(left + 1, index); 39 root->right = ConstrutTree(index, right); 40 41 return root; 42 } 43 44 void InOrderTraversal(Node* root) 45 { 46 if (root == nullptr) 47 return; 48 InOrderTraversal(root->left); 49 inSequence.push_back(root->value); 50 InOrderTraversal(root->right); 51 } 52 53 void PostOrderTraversal(Node* root) 54 { 55 if (root == nullptr) 56 return; 57 PostOrderTraversal(root->left); 58 PostOrderTraversal(root->right); 59 postSequence.push_back(root->value); 60 } 61 62 int main() 63 { 64 int nodeNum; 65 cin >> nodeNum; 66 for (int i = 0; i < nodeNum; i++) 67 cin >> sequence[i]; 68 69 //judge if it is the mirror of BST 70 if (nodeNum>1 && sequence[1] > sequence[0]) 71 isMirror = true; 72 73 Node* root = ConstrutTree(0, nodeNum); 74 InOrderTraversal(root); 75 PostOrderTraversal(root); 76 bool flag1 = true, flag2 = true; 77 for (int i = 1; i < inSequence.size(); i++) 78 { 79 if (inSequence[i] < inSequence[i - 1]) 80 flag1 = false; 81 if (inSequence[i] > inSequence[i - 1]) 82 flag2 = false; 83 if (!flag1&&!flag2) 84 break; 85 } 86 87 88 if (flag1 || flag2) 89 { 90 cout << "YES" << endl; 91 for (int j = 0; j < postSequence.size() - 1; j++) 92 cout << postSequence[j] << " "; 93 cout << postSequence.back(); 94 } 95 else 96 cout << "NO"; 97 }
PAT 1043. Is It a Binary Search Tree (25)
标签:
原文地址:http://www.cnblogs.com/jackwang822/p/4720897.html