一、题目大意
- PAT A1043
- 给出 n 个正整数作为二叉排序树的结点插入序列,判断这个序列是否为该二叉排序树的先序序列或是该二叉排序树的镜像树的先序序列。
二、解题思路
- 根据插入序列构建二叉排序树,然后分别生成先序序列和镜像先序序列,进行判断即可。
三、参考代码
#include<iostream>
#include<vector>
using namespace std;
vector <int> origin, pre_order, pre_mirror;
bool first = true;
struct node {
int data;
node* left = NULL;
node* right = NULL;
};
void insert(node* &root, int data) {
if (root == NULL) {
root = new node;
root->data = data;
return;
}
if (root->data > data)
insert(root->left, data);
else insert(root->right, data);
}
void pre_traversal(node* root) {
if (root == NULL) return;
pre_order.push_back(root->data);
pre_traversal(root->left);
pre_traversal(root->right);
}
void pre_mirror_traversal(node* root) {
if (root == NULL) return;
pre_mirror.push_back(root->data);
pre_mirror_traversal(root->right);
pre_mirror_traversal(root->left);
}
void post_print(node* root) {
if (root == NULL) return;
post_print(root->left);
post_print(root->right);
if (!first) cout << ' ';
cout << root->data;
first = false;
}
void post_mirror_print(node* root) {
if (root == NULL) return;
post_mirror_print(root->right);
post_mirror_print(root->left);
if (!first) cout << ' ';
cout << root->data;
first = false;
}
int main() {
int n;
cin >> n;
node* BST = NULL;
for (int i = 0; i < n; i++) {
int v;
cin >> v;
origin.push_back(v);
insert(BST, v);
}
pre_traversal(BST);
pre_mirror_traversal(BST);
if (pre_order == origin ) {
cout << "YES" << endl;
post_print(BST);
cout << endl;
}
else if (pre_mirror == origin) {
cout << "YES" << endl;
post_mirror_print(BST);
cout << endl;
}
else cout << "NO" << endl;
return 0;
}
四、解题感悟
- 常规题。