标签:
(二叉树建立方法)
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>
using namespace std;
struct BST {
int val;
BST* left;
BST* right;
};
int a[1005], flag = 1;
BST* BuildBST(int s,int e) {
int i, j;
if (s > e)
return NULL;
for ( i = s + 1; i <= e; i++) {
if (a[s] <= a[i]) {
break;
}
}
for ( j = i; j <= e; j++) {
if (a[s] > a[j]) {
flag = 0;
return NULL;
}
}
BST *node=(BST*)malloc(sizeof(BST));
node->val = a[s];
node->left = BuildBST(s + 1, i - 1);
node->right = BuildBST(i, e);
return node;
}
BST* BuildMirrorBST(int s, int e) {
int i, j;
if (s > e)
return NULL;
for ( i = s + 1; i <= e; i++) {
if (a[s] > a[i]) {
break;
}
}
for ( j = i; j <= e; j++) {
if (a[s] <= a[j]) {
flag = 0;
return NULL;
}
}
BST *node = (BST*)malloc(sizeof(BST));
node->val = a[s];
node->left = BuildMirrorBST(s + 1, i - 1);
node->right = BuildMirrorBST(i, e);
return node;
}
void PrintPostorder(BST* node,int cnt) {
if (node == NULL) {
return;
}
PrintPostorder(node->left,cnt+1);
PrintPostorder(node->right,cnt+1);
if (cnt == 0)
cout << node->val;
else
cout << node->val<< " " ;
}
int main(void) {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
BST* root = BuildBST(0, n - 1);
if (flag) {
cout << "YES" << endl;
PrintPostorder(root,0);
}
else {
flag = 1;
BST* root = BuildMirrorBST(0, n - 1);
if (flag) {
cout << "YES" << endl;
PrintPostorder(root,0);
}
else {
cout << "NO" << endl;
}
}
return 0;
}
1043. Is It a Binary Search Tree (25)
标签:
原文地址:http://www.cnblogs.com/zzandliz/p/5023152.html