Sicily 1210 二叉樹

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章