行業(yè)門戶網(wǎng)站如何做永久免費個人網(wǎng)站注冊
題目
給出一棵二叉樹的中序與后序排列。求出它的先序排列。(約定樹結(jié)點用不同的大寫字母表示,且二叉樹的節(jié)點個數(shù)≤8)。
輸入輸出格式
輸入格式
共兩行,均為大寫字母組成的字符串,表示一棵二叉樹的中序與后序排列。
輸出格式
共一行一個字符串,表示一棵二叉樹的先序。
輸入輸出樣例
輸入樣例
BADC
BDCA
輸出樣例
ABCD
解析
基本知識:給你一個后序遍歷,那么最后一個就是根(如ABCD,則根為D)。因為題目求先序,意味著要不斷找根。
那么我們來看這道題方法:(示例)
中序ACGDBHZKX,后序CDGAHXKZB,首先可找到主根B;
那么我們找到中序遍歷中的B,由這種遍歷的性質(zhì),可將中序遍歷分為ACGD和HZKX兩棵子樹,
那么對應(yīng)可找到后序遍歷CDGA和HXKZ(從頭找即可)
從而問題就變成求:
1.中序遍歷ACGD,后序遍歷CDGA的樹
2.中序遍歷HZKX,后序遍歷HXKZ的樹;
接著遞歸,按照原先方法,找到1.子根A,再分為兩棵子樹;2.子根Z,再分為兩棵子樹。
就按這樣一直做下去(先輸出根,再遞歸);
模板概括為step1:找到根并輸出;
step2:將中序,后序各分為左右兩棵子樹;
step3:遞歸,重復(fù)step1,2。
#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));//substr功能為復(fù)制子字符串,要求從指定位置開始,并具有指定的長度。如果沒有指定長度或超出了源字符串的長度,則子字符串將延續(xù)到源字符串的結(jié)尾beford(in.substr(k+1),after.substr(k,in.size()-k-1));//遞歸左右兩個子樹}
}
int main(){string inord,aftord;cin>>inord>>aftord;beford(inord,aftord);cout<<endl;return 0;
}