【樹論】求先序遍歷

原題傳送門ios

題目


題目描述

給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不一樣的大寫字母表示)。spa

輸入輸出格式

輸入格式:
2行,均爲大寫字母組成的字符串,表示一棵二叉樹的中序與後序排列。
輸出格式:
1行,表示一棵二叉樹的先序。code

思路


首先,一點基本常識,給你一個後序遍歷,那麼最後一個就是根(如ABCD,則根爲D)。
由於題目求先序,意味着要不斷找根。
中序ACGDBHZKX,後序CDGAHXKZB,首先可找到主根B;
那麼咱們找到中序遍歷中的B,由這種遍歷的性質,可將中序遍歷分爲ACGD和HZKX兩棵子樹,
那麼對應可找到後序遍歷CDGA和HXKZ(從頭找便可)
從而問題就變成求1.中序遍歷ACGD,後序遍歷CDGA的樹 2.中序遍歷HZKX,後序遍歷HXKZ的樹;
接着遞歸,按照原先方法,找到1.子根A,再分爲兩棵子樹2.子根Z,再分爲兩棵子樹。
就按這樣一直作下去(先輸出根,再遞歸);
模板歸納爲step1:找到根並輸出
step2:將中序,後序各分爲左右兩棵子樹;
step3:遞歸,重複step1,2;遞歸

Code


#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
void beford(string in,string after){
    if (in.size()>0){
        char ch=after[after.size()-1];
        cout<<ch;//找根輸出
        int k=in.find(ch);
        beford(in.substr(0,k),after.substr(0,k));
        beford(in.substr(k+1),after.substr(k,in.size()-k-1));//遞歸左右子樹;
    }
}
int main(){
    string inord,aftord;
    cin>>inord;cin>>aftord;//讀入
    beford(inord,aftord);cout<<endl;
    return 0;
}
相關文章
相關標籤/搜索