用二叉树的先序和后序构造出任意一颗二叉树:
判断是否唯一的条件(在构建二叉树中,若出现了一个区间为2,则不能判断该分枝上的孩子节点是左节点还是右节点,则将flag置为0)
//
// main.cpp
// test6
//
// Created by Jacky Roth on 2019/2/28.
// Copyright © 2019 Jacky Roth. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int maxn=35;
int N;
int pre[maxn],post[maxn];
struct tree {
int data;
tree* lchild;
tree* rchild;
}node[maxn];
bool flag=1;
tree* creat_node(int x){
tree* root=new tree();
root->data=x;
root->lchild=NULL;
root->rchild=NULL;
return root;
}
tree* creat_tree(int preL,int preR,int postL,int postR){
if (preL>preR) {
return NULL;
}
int key=pre[preL];
tree* root=creat_node(key);
if (preR-preL>0) {
if (preR-preL==1) {
flag=0;
}
int lroot=pre[preL+1];
int k=postL;
for (; k<=postR&&post[k]!=lroot; k++) {
}
int len=k-postL+1;
root->lchild=creat_tree(preL+1, preL+len, postL, k);
root->rchild=creat_tree(preL+len+1, preR, k+1, postR-1);
}
return root;
}
void in_order(tree* root){
if (root!=NULL) {
in_order(root->lchild);
printf("%d",root->data);
if (--N) {
printf(" ");
}else{
printf("\n");
}
in_order(root->rchild);
}
}
int main(int argc, const char * argv[]) {
scanf("%d",&N);
for (int i=0; i<N; i++) {
scanf("%d",&pre[i]);
}
for (int i=0; i<N; i++) {
scanf("%d",&post[i]);
}
tree* root=creat_tree(0, N-1, 0, N-1);
if (flag) {
printf("Yes\n");
}else{
printf("No\n");
}
in_order(root);
return 0;
}