题目大意:给定一个数n表示二叉树的节点数,求这么多个节点能够表示多少种不同结构的二叉树
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
dp[1] = 1;
dp[0] = 1;
for(int i = 2; i <= n; i++) {
int low = 0, high = i - 1;
int mid = -1;
if((low + high) % 2 == 0) {
mid = (low + high) / 2;
}
while(low <= high) {
dp[i] += dp[low] * dp[high];
low++;
high--;
}
dp[i] *= 2;
if(mid != -1) {
dp[i] -= dp[mid]*dp[mid];
}
}
return dp[n];
}
};
解题思路:动态规划, dp[n]表示n个节点能够表示的二叉树的种类
dp[n] = dp[0] * dp[n - 1] + dp[1] * dp[n - 2] + ... + dp[n - 1] * dp[0];
其中dp[i] * dp[n - 1 - i]表示根节点左子树由i个节点组成,右子树由n - 1 - i 个节点组成