# Counting Binary Tree
最近演算法剛學到DP,其中一個問題是如何有效率的執行矩陣乘法
如果使用暴力解,那可以執行的乘法順序將會和catalan number相同
讓我想起了Data Structure有學到的東西
這題和給定1,...,n個node,有幾種可能的binary tree是相同的
給定一個數列1,...,n的infix/postfix或者infix/prefix表示法
可以唯一決定一顆binary tree,事實上每個infix都對應到唯一的binary tree,延伸的問題是,給一個postfix或prefix,他們可能對應到的binary tree有幾種
解法有數種,其中最直觀就是使用DFS
將prefix(or postfix)丟入stack中看能產生幾種permutation
DFS執行之可能順序即是infix的可能,記得inorder就是LVR
以下是DFS的程式碼
```cpp=
#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;
const int Size=3;
stack<int> s;
inline void DFS(int* a,int index,queue<int> result) {
if (result.size() == Size) {
while (!result.empty()) {
cout << result.front() << " ";
result.pop();
}
cout << endl;
return;
}
if (index >= 0) {
s.push(a[index]);
index--;
DFS(a, index,result);
s.pop();
index++;
}
if (!s.empty()) {
int tmp = s.top();
result.push(s.top());
s.pop();
DFS(a, index,result);
result.pop();
s.push(tmp);
}
}
int main(void) {
int a[Size] = { 3,2,1 };
while (!s.empty())
s.pop();
queue<int> q;
while (!q.empty())
q.pop();
DFS(a, 2,q);
return 0;
}
```
輸入1,2,3,可能產生的infix順序有幾種
另一個是用DP的方式執行
$F(n)=\sum_{i=0}^{n-1}F(i)*F(n-i)$