题目链接
题目分析
给出一个序列,判断是否为BST
树的先序遍历序列
解题思路
1、按照所给序列构造BST
树;
2、先序遍历这棵树,得到的序列与所给序列相同则说明是,否则不是
注:用vector
保存序列,这样比较时比较方便,不然还要写循环;
AC程序(C++)
/**********************************
*@ID: 3stone
*@ACM: PAT.A1043 Is It a Binary Search Tree
*@Time: 18/8/13
*@IDE: VSCode 2018 + clang++
***********************************/
#include<cstdio>
#include<vector>
using namespace std;
//结点
struct node{
int data;
node *lchild, *rchild;
};
int N;
vector<int> org, pre, pre_mirror, post, post_mirror;
node* new_node(int x) {
node* root = new node;
root->data = x;
root->lchild = root->rchild = NULL;
return root;
}
void insert(node* &root, int data_x) {
if(root == NULL){
root = new_node(data_x);
return;
}
if(data_x < root->data) {
insert(root->lchild, data_x);
} else {
insert(root->rchild, data_x);
}
}
void pre_order_normal(node *root) {
if(root == NULL) return;
pre.push_back(root->data);
pre_order_normal(root->lchild);
pre_order_normal(root->rchild);
}
void pre_order_mirror(node *root) {
if(root == NULL) return;
pre_mirror.push_back(root->data);
pre_order_mirror(root->rchild);
pre_order_mirror(root->lchild);
}
void post_order_normal(node* root) {
if(root == NULL) return;
post_order_normal(root->lchild);
post_order_normal(root->rchild);
post.push_back(root->data);
}
void post_order_mirror(node* root) {
if(root == NULL) return;
post_order_mirror(root->rchild);
post_order_mirror(root->lchild);
post_mirror.push_back(root->data);
}
//输出保存在vector中的序列
void output_seq(vector<int> vec) {
int num = 0;
for(int i = 0 ; i < vec.size(); i++) {
if(++num == N)
printf("%d\n", vec[i]);
else
printf("%d ", vec[i]);
}
}
int main() {
int key;
while(scanf("%d", &N) != EOF) {
node* root = NULL;
org.clear();
pre.clear();
pre_mirror.clear();
post.clear();
post_mirror.clear();
for(int i = 0; i < N; i++) {
scanf("%d", &key);
insert(root, key);
org.push_back(key);
}
pre_order_normal(root);
if(pre == org) {
printf("YES\n");
post_order_normal(root);
output_seq(post);
} else {
pre_order_mirror(root);
if(pre_mirror == org) {
printf("YES\n");
post_order_mirror(root);
output_seq(post_mirror);
} else {
printf("NO\n");
}
} //else
}//while
return 0;
}