1. 程式人生 > >根據先序和中序輸出後序遍歷

根據先序和中序輸出後序遍歷

題目描述:

二叉樹的前序、中序、後序遍歷的定義: 前序遍歷:對任一子樹,先訪問跟,然後遍歷其左子樹,最後遍歷其右子樹; 中序遍歷:對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹; 後序遍歷:對任一子樹,先遍歷其左子樹,然後遍歷其右子樹,最後訪問根。 給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷(提示:給定前序遍歷與中序遍歷能夠唯一確定後序遍歷)。

輸入描述:

兩個字串,其長度n均小於等於26。
第一行為前序遍歷,第二行為中序遍歷。
二叉樹中的結點名稱以大寫字母表示:A,B,C....最多26個結點。

輸出描述:

輸入樣例可能有多組,對於每組測試樣例,
輸出一行,為後序遍歷的字串。

輸入樣例:

ABC
BAC
FDXEAG
XDEFAG

輸出樣例:

BCA
XEDGAF

相關知識:

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

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

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

AC程式碼:

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

void getpost(string preorder,string inorder)  //根據先序和後序求中序
{
    int n = preorder.length();  //n為每次遍歷數目
    if(n > 0)
    {
        char root = preorder[0];   //根結點為先序遍歷的第一個
        int i = inorder.find(root);  //中序遍歷中根結點的所在下標
        getpost(preorder.substr(1,i),inorder.substr(0,i)); //左子樹
        getpost(preorder.substr(i+1),inorder.substr(i+1)); //右子樹
        cout << root;
    }
}

int main()
{
    string preorder,inorder;  //先序遍歷和中序遍歷
    while(cin >> preorder >> inorder)
    {
        getpost(preorder,inorder);
        cout << endl;
    }
    return 0;
}