1. 程式人生 > >HBU-DS2018SY-2-2 根據後序和中序遍歷輸出先序遍歷 (25 分)

HBU-DS2018SY-2-2 根據後序和中序遍歷輸出先序遍歷 (25 分)

題目描述:

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。

輸入格式:

第一行給出正整數N(≤30),是樹中結點的個數。隨後兩行,每行給出N個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。

輸出格式:

在一行中輸出Preorder:以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多餘空格。

輸入樣例:

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

輸出樣例:

Preorder: 4 1 3 2 6 5 7

相關知識: 

1.先序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①訪問根結點;②先序遍歷根結點的左子樹;③先序遍歷根結點的右子樹。 簡單來說先序遍歷就是在深入時遇到結點就訪問。

2.中序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①中序遍歷根結點的左子樹;②訪問根結點;③中序遍歷根結點的右子樹。簡單來說中序遍歷就是從左子樹返回時遇到結點就訪問。

3.後序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①後序遍歷根結點的左子樹;②後序遍歷根結點的右子樹;③訪問根結點。簡單來說後序遍歷就是從右子樹返回時遇到結點就訪問。

AC程式碼:

#include <bits/stdc++.h>
using namespace std;

void getpre(int *a,int *b,int n)    //其中陣列a為後序,b為中序,n為每次遍歷數目,用來求c這個先序
{
    if(n>0)  
    { 
        int root = a[n-1];  //根結點為後序遍歷的最後一個
        int i;
        for(i=0;i<n;i++)    //在中序遍歷中查詢根結點
        {
            if(b[i] == root) 
            {
                break;
            }
        }
        cout << " " << root;
        getpre(a, b, i);    //對左子樹來查詢根結點
        getpre(a+i, b+i+1, n-i-1);  //對右子樹來查詢根結點
    }
}

int main()
{
    int n;
    cin >> n;
    int a[n],b[n],c[n];  //a[n]後序 b[n]中序
    for(int i=0;i<n;i++)
    {
        cin >> a[i];    //輸入後序
    }
    for(int i=0;i<n;i++)
    {
        cin >> b[i];    //輸入中序
    }
    cout << "Preorder:";
    getpre(a,b,n);
    return 0;
}