已知中序遍歷,后序遍歷,求前序遍歷


現在知道中序,后序,則再后序遍歷中最后一個為根節點,然后我們要求的為前序遍歷,先輸出根節點,然后在中序遍歷中找到第一個根節點,會將中序遍歷分為兩大部分,就是左右兩棵子樹。

再對應的除去第一個根節點后,在后序遍歷中根據中序遍歷分的兩個子樹,分別對應后序遍歷的部分,再在后序遍歷中尋找到下一個根節點再繼續遞歸。

打個比方:

中序ACGDBHZKX,后序CDGAHXKZB,首先可找到主根B;

那么我們找到中序遍歷中的B,由這種遍歷的性質,可將中序遍歷分為ACGD和HZKX兩棵子樹,

那么對應可找到后序遍歷CDGA和HXKZ(從頭找即可)

從而問題就變成求1.中序遍歷ACGD,后序遍歷CDGA的樹 2.中序遍歷HZKX,后序遍歷HXKZ的樹;

接着遞歸,按照原先方法,找到1.子根A,再分為兩棵子樹2.子根Z,再分為兩棵子樹。

代碼:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM