思路:建两颗树,另一颗为镜像。一边先序一边验证。
注意:原树的先序不对后,要接着验证镜像,均不满足后才能输出 "NO"。
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;
const int N = 1005;
int n, pre[N], post[N], cnt, flag;
typedef struct BST {
int data;
BST* lchild, * rchild;
}BSTNode,*BSTree;
// 建树
bool BST_Insert(BSTree &T,int data)
{
if (T == NULL) {
T = new BSTNode;
T->data = data;
T->lchild = T->rchild = NULL;
return true;
}
else if (data < T->data) {
return BST_Insert(T->lchild, data);
}
else {
return BST_Insert(T->rchild, data);
}
}
// 建镜像树
bool RBST_Insert(BSTree& T, int data)
{
if (T == NULL) {
T = new BSTNode;
T->data = data;
T->lchild = T->rchild = NULL;
return true;
}
else if (data >= T->data) {
return RBST_Insert(T->lchild, data);
}
else {
return RBST_Insert(T->rchild, data);
}
}
void Prior_Order(BSTree T)
{
if (T != NULL)
{
// 验证所给序列
if (pre[++cnt] != T->data) {
flag = 1;
return;
}
Prior_Order(T->lchild);
Prior_Order(T->rchild);
}
}
// 后序遍历
void Post_Order(BSTree T)
{
if (T != NULL)
{
Post_Order(T->lchild);
Post_Order(T->rchild);
post[++cnt] = T->data;
}
}
int main()
{
ios::sync_with_stdio(false);
BSTree T = NULL, R = NULL;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> pre[i];
BST_Insert(T, pre[i]);
RBST_Insert(R, pre[i]);
}
Prior_Order(T);
if (!flag)
{
cnt = 0;// 下标初始化
cout << "YES\n";
Post_Order(T);
for (int i = 1; i < n; i++) {
cout << post[i] << ' ';
}
cout << post[n];
}
else
{
cnt = 0; flag = 0;// 下标初始化
Prior_Order(R);
if (!flag) {
cnt = 0;// 下标初始化
cout << "YES\n";
Post_Order(R);
for (int i = 1; i < n; i++) {
cout << post[i] << ' ';
}
cout << post[n];
}
else {
cout << "NO\n";
}
}
return 0;
}