一丶已知前序遍历,中序遍历, 求后序遍历
(这里将读入调换,函数不变,已知中序遍历,前序遍历,求后序遍历 结果一样)
代码:
#include <bits/stdc++.h>
int t1[5000] , t2[5000] ;
using namespace std ;
void build(int a , int b , int n , int flag)
{
if(n==1)
{
printf("%d ",t1[a]);
return ;
}
else if(n<=0) return ;
int i = 0 ;
while(t1[a]!=t2[b+i]) i++;
build(a+1,b,i,0);
build(a+i+1,b+i+1,n-i-1,0);
if(flag==1) printf("%d",t1[a]);
else printf("%d ",t1[a]);
}
int main()
{
int n ;
while(cin>>n)
{
for(int i = 1 ; i <= n ; i++) cin>>t1[i]; //*前序
for(int i = 1 ; i <=n ; i++) cin>>t2[i] ;//*中序
build(1,1,n,1); //*前+中 == 后
printf("\n");
}
}
二、已知中序,后序,求前序
#include <bits/stdc++.h>
using namespace std ;
int t1[5000] , t2[5000] ;
void build(int a , int b , int n , int flag)
{
if(n==1)
{
printf(" %d",t1[a]);
return ;
}
else if(n<=0) return ;
if(flag==1)
{
printf("%d",t1[a]);
}
else printf(" %d",t1[a]);
int i = 0 ;
while(t1[a]!=t2[b+i]) i++;
build(a-n+i,b,i,0);
build(a-1,b+i+1,n-i-1,0);
}
int main()
{
int n ;
while(cin>>n)
{
for(int i = 1 ; i<=n ; i++) cin>>t1[i] ; //*中序
for(int i = 1 ; i<=n ; i++) cin>>t2[i] ; //*后序
build(n,1,n,1) ;
printf("\n");
}
}