1. 程式人生 > >HDU 1710 Binary Tree Traversals 題解

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