分析
以二叉排序树的前序序列为输入序列,重新构成的二叉排序树和原二叉排序树相同,因此,判断输入序列的是否是某一棵二叉排序树的前序序列,只需要判断用输入序列构成的二叉排序树的前序序列是否和输入序列相同即可。
//
// Created by CyIce on 2021/1/12.
//
#include <stdio.h>
#include <vector>
using namespace std;
const int MAXN = 1000;
int N, inputList[MAXN];
//二叉树后序和前序序列
vector<int> postList, preList;
//二叉树节点信息
struct node {
int data;
node *left, *right;
};
//新建节点
node *newNode(int x) {
node *Node = new node;
Node->data = x;
Node->left = Node->right = NULL;
return Node;
}
//插入节点
void insert(node *&node, int x) {
if (node == NULL) {
node = newNode(x);
return;
}
if (node->data <= x)
insert(node->right, x);
else
insert(node->left, x);
}
//镜向翻转二叉树
void mirror(node *&tree) {
if (tree == NULL)
return;
else {
node *temp = tree->left;
tree->left = tree->right;
tree->right = temp;
mirror(tree->left);
mirror(tree->right);
}
}
//前序遍历
void preTravel(node *tree) {
if (tree == NULL)
return;
preList.push_back(tree->data);
preTravel(tree->left);
preTravel(tree->right);
}
//比较输入序列和二叉树的前序遍历序列是否相同
bool checkPreOrder() {
for (int i = 0; i < N; ++i) {
if (preList[i] != inputList[i])
return false;
}
return true;
}
//后序遍历
void postTravel(node *tree) {
if (tree == NULL)
return;
postTravel(tree->left);
postTravel(tree->right);
postList.push_back(tree->data);
}
int main() {
scanf("%d", &N);
node *tree = NULL;
bool ans1, ans2;
for (int i = 0; i < N; ++i) {
scanf("%d", &inputList[i]);
insert(tree, inputList[i]);
}
preTravel(tree);
ans1 = checkPreOrder();
if (!ans1) {
mirror(tree);
preList.clear();
preTravel(tree);
}
ans2 = checkPreOrder();
postTravel(tree);
if (ans1 || ans2) {
printf("YES\n");
int i;
for (i = 0; i < N - 1; ++i) {
printf("%d ", postList[i]);
}
printf("%d\n", postList[i]);
} else
printf("NO\n");
return 0;
}