一道清華的上機題目

同學讓我幫寫的,還寫了好多註釋,丟掉可惜了,發上來吧。。呵呵 

試題三(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 

//writen by sunboy
//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;
}

題目很簡單就是一個遞歸實現的過程,把握好終止條件就行了。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章