遍历转换

来源:互联网 发布:ios4邪恶福利软件 编辑:程序博客网 时间:2024/04/30 05:27
//根据先序(1 2 4 7 3 5 8 9 6)和中序遍历(4 7 2 1 8 5 9 3 6)写出后序遍历#include<iostream>using namespace std;int t1[1001],t2[1001];void sousuo(int a,int b,int n,int flag){     //sousuo(1 1 n 1)    if(n==1)//如果存在左子树或右子树就直接输出    {        printf("%d ",t1[a]);        return ;    }    else if(n<=0)//如果不存在左子树或右子树就返回上一层        return ;    int i;//继续划分为左子树和右子树    for(i=0;t1[a]!=t2[b+i];i++) ;//找到划分点也就是根节点    sousuo(a+1,b,i,0);//左子树的遍历    sousuo(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,i;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)            scanf("%d",&t1[i]);//t1中存的是先序        for(i=1;i<=n;i++)//t2中存的中序            scanf("%d",&t2[i]);        sousuo(1,1,n,1);        printf("\n");    }    return 0;}
0 0