Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
在衆多的數據結構中,二叉樹是一種特殊而重要的結構,有着廣泛的應用。二叉樹或者是一個結點,或者有且僅有一個結點爲二叉樹的根,其餘結點被分成兩個互不相交的子集,一個作爲左子集,另一個作爲右子集,每個子集又是一個二叉樹。
遍歷一棵二叉樹就是按某條搜索路徑巡訪其中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。最常使用的有三種遍歷的方式:
1.前序遍歷:若二叉樹爲空,則空操作;否則先訪問根結點,接着前序遍歷左子樹,最後再前序遍歷右子樹。
2.中序遍歷:若二叉樹爲空,則空操作;否則先中序遍歷左子樹,接着訪問根結點,最後再前中遍歷右子樹。
3.後序遍歷:若二叉樹爲空,則空操作;否則先後序遍歷左子樹,接着後序遍歷右子樹,最後再訪問根結點。
例如圖(1)所示的二叉樹:
前序遍歷的順序是ABCD,中序遍歷的順序是CBAD,後序遍歷的順序是CBDA。
對一棵二叉樹,如果給出前序遍歷和中許遍歷的結點訪問順序,那麼後序遍歷的順序是唯一確定的,也很方便地求出來。但如果現在只知道前序遍歷和後序遍歷的順序,中序遍歷的順序是不確定的,例如:前序遍歷的順序是ABCD,而後序遍歷的順序是CBDA,那麼就有兩課二叉樹滿足這樣的順序(見圖(1)和圖(2))。
現在的問題是給定前序遍歷和後序遍歷的順序,要求出總共有多少棵不同形態的二叉樹滿足這樣的遍歷順序。
Input
整個輸入有兩行,第一行給出前序遍歷的訪問順序,第二行給出後序遍歷的訪問順序。
二叉樹的結點用一個大寫字母表示,不會有兩個結點標上相同字母。輸入數據不包含空格,且保證至少有一棵二叉樹符合要求。
Output
輸出一個整數,爲符合要求的不同形態二叉樹的數目。
Sample Input
ABCD CBDA
Sample Output
2
Problem Source
ZSUACM Team Member
Solution
將二叉樹剖分成左子樹和右子樹,若有一樹的節點數爲0,則說明這個子樹可以在左邊也可以在右邊,那麼數目*2就ok,遞歸劃分就解決啦
#include <iostream>
#include <cstring>
using namespace std;
char pre[10005], post[10005];
long long cal(char * pre, char * post, int len)
{
if (len <= 1 && len != 0) return 1;
if (len == 0) return 2;//子樹爲空
int j;
for (j = 0; j < len; ++j) if (pre[1] == post[j]) break;
if (j != len) return cal(pre+1, post, j+1) * cal(pre+j+1, post+j+1, len-j-2);//子樹劃分
else return 0;
}
int main()
{
cin >> pre >> post;
cout << cal(pre, post, strlen(post));//害我WA一次的格式
return 0;
}