题意
给定先序,后序,判断是否能构造一棵唯一的二叉树
若能,则输出Yes及层序遍历
不能,则输出No及任意一解的层序遍历
2019南大计算机夏令营机试(外省)第三题
给定先序后序求能构造出多少种不同的二叉树
源码
#include<iostream>
#include<vector>
using namespace std;
struct Node{
int val;
Node* lchild;
Node* rchild;
Node(int x){
val=x;
lchild=rchild=NULL;
}
};
int n;
int preorder[35];
int postorder[35];
int counter=0;
vector<int>num;
Node* buildTree(int target,int prl,int prr){
Node* root=new Node(postorder[target]);
target--;
int pos=-1;
for(int i=prl;i<=prr;i++){
if(postorder[target]==preorder[i]){
pos=i;
break;
}
}
if(pos==-1) return root;
if(preorder[pos-1]==postorder[target+1]){
//不唯一
root->rchild=buildTree(target,pos,prr);
root->lchild=NULL;
counter++;
} else{
//唯一
root->rchild=buildTree(target,pos,prr);
root->lchild=buildTree(target-(prr-pos)-1,prl+1,pos-1);
}
return root;
}
void inorder(Node* root){
if(root==NULL) return;
inorder(root->lchild);
num.push_back(root->val);
inorder(root->rchild);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>preorder[i];
}
for(int i=1;i<=n;i++){
cin>>postorder[i];
}
Node* root;
root=buildTree(n,1,n);
inorder(root);
if(counter==0){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
for(int i=0;i<num.size()-1;i++){
cout<<num[i]<<" ";
}
cout<<num[n-1]<<endl;
return 0;
}