2014
11-18

LeetCode-Unique Binary Search Trees[二叉树]

Unique Binary Search Trees

Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?

For example,
Given n = 3, there are a total of 5 unique BST’s.

   1         3     3      2      1
\       /     /      / \      \
3     2     1      1   3      2
/     /       \                 \
2     1         2                 3


\begin{Code}
1 1 2 3 3
\ \ / \ / /
3 2 1 3 2 1
/ \ / \
2 3 1 2
\end{Code}

\textbf{以i为根节点的树，其左子树由[1, i-1]构成， 其右子树由[i+1, n]构成。}

\begin{Code}
1 2
\ /
2 1
\end{Code}

\begin{eqnarray}
f(2) &=& f(0) * f(1) \text{ ，1为根的情况} \nonumber \\
&+& f(1) * f(0) \text{ ，2为根的情况} \nonumber
\end{eqnarray}

\begin{eqnarray}
f(3) &=& f(0) * f(2) \text{ ，1为根的情况} \nonumber \\
&+& f(1) * f(1) \text{ ，2为根的情况} \nonumber \\
&+& f(2) * f(0) \text{ ，3为根的情况} \nonumber
\end{eqnarray}

$$f(i) = \sum_{k=1}^{i} f(k-1) \times f(i-k)$$

// LeetCode, Unique Binary Search Trees
// 时间复杂度O(n^2)，空间复杂度O(n)
class Solution {
public:
int numTrees(int n) {
vector<int> f(n + 1, 0);

f[0] = 1;
f[1] = 1;
for (int i = 2; i <= n; ++i) {
for (int k = 1; k <= i; ++k)
f[i] += f[k-1] * f[i - k];
}

return f[n];
}
};


Java代码:

public class Solution {
public int numTrees(int n) {
int dp[] = new int[n+1];
dp[0] = dp[1] = 1;
for(int i=2; i<=n; i++){
for(int k=1; k<=i; k++){
dp[i] += dp[k-1] * dp[i-k];
}
}
return dp[n];
}
}