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;
}

猜你喜欢

转载自blog.csdn.net/aptx4869971/article/details/83046735
今日推荐