1043 Is It a Binary Search Tree(25 分)
作者: CHEN, Yue
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
- Both the left and right subtrees must also be binary search trees.
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 11
Sample Output 1:
YES
5 7 6 8 11 10 8
Sample Input 2:
7
8 10 11 8 6 7 5
Sample Output 2:
YES
11 8 10 7 5 6 8
Sample Input 3:
7
8 6 8 5 10 9 11
Sample Output 3:
NO
这是一道关于二叉搜索树的问题。
首先按照题目给出的序列生成一个二叉搜索树,然后判断这个序列是不是这棵树的先序遍历。如果是,就输出YES并且在下一行输出这棵树的后序遍历。如果不是,就判断这棵树的镜像树(也就是把所有非叶子节点的所有子树交换位置)的先序遍历是否和这个序列相同,如果相同就输出这棵镜像树的后序遍历,如果不同,输出NO。
整道题的流程还算中规中矩,所以细节就不在赘述,如果有问题可以留言给我。
AC代码:
#include <cstdio>
const int maxn = 1010;
struct Tree {
int data;
Tree * lchild, * rchild;
};
int n;
int input[maxn], pre[maxn], prenum = 0;
bool first = true;
void insertNode(Tree *&, int);
void preTravel(Tree *&);
void mirrorTree(Tree *&);
bool isSame();
void outputPostTravel(Tree *&);
int main() {
Tree * root = NULL;
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", &input[i]);
insertNode(root, input[i]);
}
preTravel(root);
if(isSame()) {
printf("YES\n");
outputPostTravel(root);
} else {
prenum = 0;
mirrorTree(root);
preTravel(root);
if(isSame()) {
printf("YES\n");
outputPostTravel(root);
} else {
printf("NO\n");
}
}
return 0;
}
void insertNode(Tree *& root, int in) {
if(root == NULL) {
root = new Tree;
root->data = in;
root->lchild = root->rchild = NULL;
return ;
}
if(root->data <= in) {
insertNode(root->rchild, in);
} else {
insertNode(root->lchild, in);
}
}
void preTravel(Tree *& root) {
if(root == NULL) {
return ;
}
pre[prenum++] = root->data;
preTravel(root->lchild);
preTravel(root->rchild);
}
bool isSame() {
for(int i = 0; i < n; ++i) {
if(pre[i] != input[i]) {
return false;
}
}
return true;
}
void outputPostTravel(Tree *& root) {
if(root == NULL) {
return ;
}
outputPostTravel(root->lchild);
outputPostTravel(root->rchild);
if(!first) {
printf(" ");
}
printf("%d", root->data);
first = false;
}
void mirrorTree(Tree *& root) {
if(root == NULL) {
return ;
}
Tree * temp = root->lchild;
root->lchild = root->rchild;
root->rchild = temp;
mirrorTree(root->rchild);
mirrorTree(root->lchild);
}
如有错误,欢迎指摘。