PTA树的遍历(递归+模拟)

#include<bits/stdc++.h>
using namespace std;
const int maxn=37;
int zx[maxn];
int hx[maxn];
int n;
struct node{
   int l;
   int r;
};
node pp[maxn];
//la,ra表示后序
int build(int la,int ra,int lb,int rb)
{
    if(lb>rb)
        return 0;
    int root=hx[ra];
    int pos1;
    int pos2=lb;
    //pos1表示左子树的个数,pos2表示根在中序的位置
    while(zx[pos2]!=root)
    pos2++;
    pos1=pos2-lb;
    pp[root].l=build(la,la+pos1-1,lb,pos2-1);
    pp[root].r=build(la+pos1,ra-1,pos2+1,rb);
    return root;
}
void bfs()
{
    queue<int> q;
    q.push(hx[n]);
    printf("%d",hx[n]);
    while(!q.empty())
    {
       // cout<<1<<endl;
        int now=q.front();
        q.pop();
        if(now!=hx[n])
            printf(" %d",now);
        if(pp[now].l)
            q.push(pp[now].l);
        if(pp[now].r)
            q.push(pp[now].r);
    }
    printf("\n");
}
int main()
{

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>hx[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>zx[i];
    }
    build(1,n,1,n);
    bfs();
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值