题目:
https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192
首先是建树做法(没有去添加镜像,导致有两个点没过)
#include<iostream>
#include<vector>
using namespace std;
vector<int> v,pre;
int n;
bool f = false;
//建树
typedef struct TNode *Position;
typedef Position BinTree; /* 二叉树类型 */
struct TNode{ /* 树结点定义 */
int Data; /* 结点数据 */
BinTree Left; /* 指向左子树 */
BinTree Right; /* 指向右子树 */
};
//插入
BinTree Insert(BinTree BST,int x){
if(!BST){
BST = (BinTree)malloc(sizeof(struct TNode));
BST->Data = x;
BST->Left = BST->Right = NULL;
}
else{
if(x < BST->Data)
BST->Left = Insert(BST->Left,x);
else {
BST->Right = Insert(BST->Right,x);
}
}
return BST;
}
//前序
void Preorder(BinTree BST){
if(BST){
v.push_back(BST->Data);
Preorder(BST->Left);
Preorder(BST->Right);
}
}
void Postorder( BinTree BST ) {
if( BST ) {
Postorder( BST->Left ); /* 此处假设对BT结点的访问就是打印数据 */
Postorder( BST->Right );
if(!f){
printf("%d", BST->Data);
f = true;
}
else{
printf(" %d", BST->Data);
}
}
}
int main(){
cin >> n;
BinTree BST = NULL;
int t;
bool flag = true;
for(int i = 0;i < n;i++){
cin >> t;
pre.push_back(t);
BST = Insert(BST,t);
}
Preorder(BST);
for(int i = 0;i < n;i++){
if(v[i] != pre[i]){//比较建树后前序与题目给的是否一致
flag = false;
break;
}
}
if(!flag){
printf("NO");
}
else{
printf("YES\n");
Postorder(BST);//输出后续
}
return 0;
}
其次是运用二叉树性质,先认定为是二叉搜索树,把前序转为后续,如果个数与前序一致则说明是,否则转为镜像,在进行判断、、、(思路来源)
#include<iostream>
#include<vector>
using namespace std;
vector<int> v,pre;
bool isMirror = false;
void Prechange(int root,int tail){
if(root > tail) return;
int i = root + 1,j = tail;
if(!isMirror){
while(i <= tail && pre[root] > pre[i]) i++;
while(j > root && pre[root] <= pre[j]) j--;
}
else{
while(i <= tail && pre[root] <= pre[i]) i++;
while(j > root && pre[root] > pre[j]) j--;
}
if(i-j != 1) return;
Prechange(root+1,j);
Prechange(i,tail);
v.push_back(pre[root]);
}
int main(){
int n,t;
cin >> n;
for(int i = 0;i < n;i++){
cin >> t;
pre.push_back(t);
}
Prechange(0,n-1);
if(v.size() != n){
v.clear();
isMirror = true;
Prechange(0,n-1);
}
if(v.size() == n){
printf("YES\n");
printf("%d",v[0]);
for(int i = 1;i < n;i++) printf(" %d",v[i]);
}
else{
printf("NO\n");
}
return 0;
}