同學讓我幫寫的,還寫了好多註釋,丟掉可惜了,發上來吧。。呵呵
試題三(8個測試數據,每個5分,共40分)
二叉樹的前序、中序、後序遍歷的定義:
前序遍歷:對任一子樹,先訪問跟,然後遍歷其左子樹,最後遍歷其右子樹;
中序遍歷:對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹;
後序遍歷:對任一子樹,先遍歷其左子樹,然後遍歷其右子樹,最後訪問根。
給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷(提示:給定前序遍歷與中序遍歷能夠唯一確定後序遍歷)。
變量條件:二叉樹中的結點名稱以大寫字母表示:A,B,C....最多26個結點。
運行時限:1秒/測試數據。
輸入格式:兩行,第一行爲前序遍歷,第二行爲中序遍歷。
輸出格式:若不能根據前序和中序遍歷求出後序遍歷,輸出NO ANSWER;否則輸出一行,爲後序遍歷。
可執行文件:program3.exe
樣例一:
Input.txt ABC BAC Output.txt BCA
樣例二:
Input.txt FDXEAG XDEFAG Output.txt XEDGAF
樣例三:
Input.txt ABCD BDAC Output.txt NO ANSWER
//07.07.28
/*
基本思想 :
對於字符串先序:pre=“FDXEAG” 中序:mid=“XDEFAG”,要求後序rear;
先在中序中找到找到pre[0];從這個位置將mid分爲nmid1和nmid2
在這裏分別爲nmid1="XDE";nmid2="AG";從pre串中可以得到npre1="DXE";
npre2="AG";
rear=nrear1+nrear2+pre[0];
*/
#include <iostream>
#include <string>
using namespace std;
string prestr,midstr,rearstr;
int flag=0;//0:可以求得後序 1:輸出錯誤
string Calrear(string pre,string mid)//返回前序爲pre,中序爲mid字符串的後序
{
string ch="";
ch+=pre[0];
string npre1="",npre2="",nmid1="",nmid2="";
int i,j;
int len1=pre.length();
int len2=mid.length();
if(len1!=len2) {flag=1;return npre1;} //出現錯誤,找不到後序退出
if(len1==1||len1==0)
{
if(pre==mid)
return pre; //遞歸終止條件
else { flag=1;return pre;} //出現錯誤,找不到後序退出
}
i=mid.find(ch); //查找pre[0]在mid中的位置
nmid1=mid.substr(0,i); //求nmid1
nmid2=mid.substr(i+1); //求nmid2
npre1=pre.substr(1,i); //求npre1
npre2=pre.substr(i+1); //求npre2
return Calrear(npre1,nmid1)+Calrear(npre2,nmid2)+ch; //rear=nrear1+nrear2+pre[0];
}
int main()
{
cin>>prestr>>midstr;
rearstr=Calrear(prestr,midstr);
if(flag)
cout<<"NO ANSWER"<<endl;
else cout<<rearstr<<endl;
cin>>rearstr;
return 0;
}