現在知道中序,后序,則再后序遍歷中最后一個為根節點,然后我們要求的為前序遍歷,先輸出根節點,然后在中序遍歷中找到第一個根節點,會將中序遍歷分為兩大部分,就是左右兩棵子樹。
再對應的除去第一個根節點后,在后序遍歷中根據中序遍歷分的兩個子樹,分別對應后序遍歷的部分,再在后序遍歷中尋找到下一個根節點再繼續遞歸。
打個比方:
中序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; }