December 10th 模擬賽C T4 二叉樹 Solution

題目空降

Description

在衆多的數據結構中,二叉樹是一種特殊而重要的結構,有着廣泛的應用。二叉樹或者是一個節點,或者有且僅有一個節點位二叉樹的根,其餘節點被分成兩個互不相交的子集,一個作爲左子集,另一個作爲右子集。每個子集又是一個二叉樹。

遍歷一棵二叉樹就是按某條搜索路徑巡訪其中每個節點,使得每個節點均被訪問一次,而且僅被訪問一次。最常用的有三種遍歷方式:

(1)前序遍歷:若二叉樹爲空,則空操作;否則先訪問根節點,接着前序遍歷左子樹,最後前序遍歷右子樹。

(2)中序遍歷:若二叉樹爲空,則空操作;否則先中序遍歷左子樹,接着訪問根節點,最後再中序遍歷右子樹。

(3)後序遍歷:若二叉樹爲空,則空操作;否則先後序遍歷左子樹,接着後序遍歷右子樹,最後再訪問根節點。
這裏寫圖片描述
例如圖1所示的二叉樹前序遍歷的順序是ABCD,中序遍歷的順序是CBAD,後序遍歷的順序是CBDA。

對一棵二叉樹,如果給出前序遍歷和中序遍歷的節點訪問順序,那麼後序遍歷的順序是唯一確定的,也很方便地求出來。但如果現在只知道前序遍歷和後序遍歷的順序,中序遍歷的順序是不確定的,例如:前序遍歷的順序是ABCD,而後序遍歷的順序是CBDA,那麼就有兩棵二叉樹滿足這樣的順序,見圖1和圖2。

現在的問題是給定前序遍歷和後序遍歷的順序,要求出總共有多少棵不同形態的二叉樹滿足這樣的遍歷順序。

Input

整個輸入有兩行,第一行給出前序遍歷的訪問順序,第二行給出後序遍歷的訪問順序。

二叉樹的節點用一個大寫字母表示,不會有兩個節點標上相同字母。輸入數據不包含空格,且保證至少有一棵二叉樹符合要求。

Output

輸出一個整數,爲符合要求的不同形態的二叉樹的數目。

Analysis

枚舉S1每兩個相鄰的字符,將其倒過來(比如BC變成CB)
如果S2裏有倒過來後的這兩個字符就ANS*2

Implementation

自行腦補。

Code

C++

自行腦補。

Pascal

var
    x,y:String;
    ans:longint;

procedure dfs(x,y:string;len:longint);
begin
    if (len=1) then
        exit;
    if (x[2]=y[2]) then
    begin
        ans:=ans*2;
        dfs(copy(x,2,len-1),copy(y,2,len-1),len-1);
        exit;
    end;
    dfs(copy(x,2,pos(y[2],x)-2),copy(y,pos(x[2],y),len-pos(x[2],y)+1),pos(y[2],x)-2);
    dfs(copy(x,pos(y[2],x),len-pos(y[2],x)+1),copy(y,2,pos(x[2],y)-2),pos(x[2],y)-2);
end;

procedure turn(var x:string);
var
    i:Longint;
    t:string;
begin
    t:='';
    for i:=length(x) downto 1 do 
        t:=t+x[i];
    x:=t;
end;

begin
    assign(input,'init.in');reset(input);
    //assign(output,'tree.out');rewrite(output);
    readln(x);
    readln(y);
    turn(y);
    ans:=1;
    dfs(x,y,Length(x));
    writeln(ans);
end.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章