历程:
不会建树了。
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<int> pre,in;
struct node
{
int v;
struct node *left,*right;
};
node* buildTree(int prel,int prer,int inl,int inr){
node temp = new node();
node.v = pre[prel];
int k;
for(k=inl;k<=inr;k++)
if(in[k]==pre[prel])
break;
}
void exec(){
int N;cin>>N;
pre.resize(N);
in.resize(N);
for(int i=0;i<N;i++)cin>>pre[i];
for(int i=0;i<N;i++)cin>>in[i];
node* root;
root = buildTree(prel,prer,inl,inr);
}
int main(){
freopen("data.in","r",stdin);
exec();
return 0;
}
看了柳神的代码:
- 没有建树,直接用后序的递归遍历来做
- 只有在第一次后序输出的时候输出,以后虽然遍历,但不输出。
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<int> pre,in;
bool flag=true;
void post_tra(int prel,int inl,int inr){
int i;
for(i=inl;i<=inr;i++)
if(in[i]==pre[prel])
break;
post_tra(prel+1,inl,i-1);
post_tra(prel+i-inl+1,i+1,inr);
if(flag==true){
cout<<in[i]<<endl;
flag=false;
}
}
void exec(){
int N;cin>>N;
pre.resize(N);
in.resize(N);
for(int i=0;i<N;i++)cin>>pre[i];
for(int i=0;i<N;i++)cin>>in[i];
post_tra(0,0,N-1);
}
int main(){
freopen("data.in","r",stdin);
exec();
return 0;
}
提交以后全部段错误,发现是因为递归没有设置返回条件。
改成下面就好了。
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<int> pre,in;
bool flag=true;
void post_tra(int prel,int inl,int inr){
if(!flag||inl>inr)return;
int i;
for(i=inl;i<=inr;i++)
if(in[i]==pre[prel])
break;
post_tra(prel+1,inl,i-1);
post_tra(prel+i-inl+1,i+1,inr);
if(flag==true){
cout<<in[i]<<endl;
flag=false;
}
}
void exec(){
int N;cin>>N;
pre.resize(N);
in.resize(N);
for(int i=0;i<N;i++)cin>>pre[i];
for(int i=0;i<N;i++)cin>>in[i];
post_tra(0,0,N-1);
}
int main(){
freopen("data.in","r",stdin);
exec();
return 0;
}
题意:
二叉树中的所有值都是不同的正整数。
给前序和中序,输出后序序列的第一个值。