已知先序遍历和后序遍历,求中序遍历
本题我参考了柳婼的做法
柳神代码链接
分析如下
整体代码如下
#include<cstdio>
#include<vector>
using namespace std;
bool flag=true;
int n;
int post[35],pre[35];
int num=0;
vector<int>in;
void getIN(int prel,int prer,int postl,int postr){
if(prel==prer){
in.push_back(pre[prel]);
return;
}
if(pre[prel]==post[postr]){
int i=0;
while(i<=prer&&pre[i]!=post[postr-1])i++;
if(i-prel>1)
{
getIN(prel+1,i-1,postl,postl+i-prel-2);
}
else
flag=false;
in.push_back(post[postr]);
getIN(i,prer,postr-1+i-prer,postr-1);
}
}
int main(){
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]);
}
getIN(0,n-1,0,n-1);
if(flag==false)printf("No\n");
else printf("Yes\n");
for(int i=0;i<in.size();i++)
{ printf("%d",in[i]);
if(i!=in.size()-1)printf(" ");}
printf("\n");
return 0;
}
另一种解法(建树)
#include<bits/stdc++.h>
using namespace std;
int pre[35],post[35];
int cnt=0,n;
struct Node{
int data;
Node* lchild;
Node* rchild;
};
bool flag=true;
void create(int prel,int prer,int postl,int postr,Node* &root){
if(prel>prer)return;
int i;
for(i=prel;i<=prer;i++)
{ if(pre[i]==post[postr-1])
break;}
if(i==prel+1&&prel!=prer)flag=false;//排除由循环条件引起的相等的状况
root=new Node;
root->data=pre[prel];
create(prel+1,i-1,postl,postl+i-2-prel,root->lchild);
create(i,prer,postr-1+i-prer,postr-1,root->rchild);
}
void inorder(Node* root){
if(root==NULL)return;
inorder(root->lchild);
printf("%d",root->data);
cnt++;
cnt!=n?printf(" "):printf("\n");
inorder(root->rchild);
}
int main(){
cin>>n;
Node* root=NULL;
for(int i=0;i<n;i++)
scanf("%d",&pre[i]);
for(int i=0;i<n;i++)
scanf("%d",&post[i]);
create(0,n-1,0,n-1,root);
flag?printf("Yes\n"):printf("No\n");
inorder(root);
return 0;
}