【HRBUST 2040 --- 二叉树的遍历 】二叉树的遍历

【HRBUST 2040 --- 二叉树的遍历 】二叉树的遍历


Description

给出一棵二叉树的中序和前序遍历,输出它的后序遍历。

Input

本题有多组数据,输入处理到文件结束。

每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。

接下来的一行每行包括n个整数,表示这棵树的中序遍历。

接下来的一行每行包括n个整数,表示这棵树的前序遍历。

3<= n <= 100

Output

每组输出包括一行,表示这棵树的后序遍历。

Sample Input

7
4 2 5 1 6 3 7
1 2 4 5 3 6 7

Sample Output

4 5 2 6 7 3 1

题意

已知一个二叉树的中序遍历顺序和前序遍历顺序,求后序遍历顺序。

解题思路

用递归的宏观思路,结合前序历遍和中序历遍,找根节点,在中序历遍中,根节点左边的全部是左子树,右边的全部是右子树,那么将这些结点慢慢划分为一个个子问题。左子树的第一个结点又可以看作一个新的根节点,它有它的左子树和右子树,同理,慢慢划分,递归的思路也就出来了。假如中序历遍中第i个点是根节点,那么划分为两个区域,0~ i-1和i+1~n-1;
那么我们只需要将递归的顺序设置为左右根,输出的自然就是后序遍历。
详情看代码。

AC代码:

#include 
using namespace std;
const int MAXN = 1005;
int a[MAXN],b[MAXN];

int cnt=0;

void fun(int *a,int *b,int n)
{
    if(n==0)
        return;
    int i;
    for(i=0;i<n;i++)
        if(a[0]==b[i])
            break;
    fun(a+1,b,i);
    fun(a+i+1,b+i+1,n-i-1);
    cnt++;
    cout << a[0] << " ";
}

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    while(cin >> n)
    {
        cnt=0;
        for(int i=0;i<n;i++)
            cin >> b[i];
        for(int i=0;i<n;i++)
            cin >> a[i];
        fun(a,b,n);
        cout << endl;
    }
    return 0;
}

你可能感兴趣的:(ACM,HRBUST,2040,二叉树的遍历)