題目描述
給出一棵二叉樹的中序與后序排列。求出它的先序排列。(約定樹結(jié)點用不同的大寫字母表示,且二叉樹的節(jié)點個數(shù)?≤8≤8)。
輸入格式
共兩行,均為大寫字母組成的字符串,表示一棵二叉樹的中序與后序排列。
輸出格式
共一行一個字符串,表示一棵二叉樹的先序。
輸入輸出樣例
輸入 #1復(fù)制
BADC BDCA
輸出 #1復(fù)制
ABCD
說明/提示
【題目來源】
NOIP 2001 普及組第三題
首先,一點基本常識,給你一個后序遍歷,那么最后一個就是根(如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;文章來源:http://www.zghlxwxcb.cn/news/detail-421338.html
代碼如下文章來源地址http://www.zghlxwxcb.cn/news/detail-421338.html
#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;
}
到了這里,關(guān)于P1030 [NOIP2001 普及組] 求先序排列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!