HDU 1710 Binary Tree Traversals 题解

由题意得:

1.输入二叉树的前序遍历和中序遍历,输出这个二叉树的后序遍历

2.前序遍历的顺序是:根-左子树-右子树  中序遍历的顺序是:左子树-根-右子树   后序遍历的顺序是:左子树-右子树-根

3.根据前后遍历找到根后(由定义得:前序遍历的第一个为主根),可以将二叉树分为两个部分(左子树、右子树)

4.重复上一个步骤,直到遍历完所有数字

5.后序遍历就是将每次找到的根存入数组

6.图示如下:

 

7.代码如下:

#include<iostream>
using namespace std;
const int N=1005;
int pre[N],mid[N],last[N],n;

void getlast(int pa,int pb,int ma,int mb,int la,int lb)
{
    if(pa>pb||ma>mb||la>lb)
        return ;
    int a,b,i;
    for(i=ma; i<=mb; i++)
        if(mid[i]==pre[pa])
            break;
    a=i-ma;
    b=mb-i;
    last[lb]=mid[i];
    getlast(pa+1,pa+a,ma,i-1,la,la+a-1);
    getlast(pb-b+1,pb,i+1,mb,lb-b,lb-1);
}

int main()
{
    while(cin>>n)
    {
        for(int i=1; i<=n; i++)
            cin>>pre[i];
        for(int i=1; i<=n; i++)
            cin>>mid[i];
        getlast(1,n,1,n,1,n);
        for(int i=1; i<n; i++)
            cout<<last[i]<<" ";
        cout<<last[n]<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值