题意:
n个节点的二叉树,输出n个节点能组成多少二叉树的形态,unique
思路:
n=1 ans=1
n=2 ans=2
n=3 ans=5
n=4 ans=?
假设新加入的点放在根节点的位置,那么我们可以枚举:
当左边的节点个数为0,右边节点个数为2的种类:ans[0]*ans[2]=2
当左边的节点个数为1,右边节点个数为1的种类:ans[1]*ans[1]=1
当左边的节点个数为2,右边节点个数为0的种类:ans[2]*ans[0]=2
这样算到n=3时,答案是5
一种常见的增量姿势,我的第一想法是,当前n个节点,去n-1个节点的所有形态上,尝试增加一个点会多出多少形态,但是发现会有重复。 想到新增的这个点当做根节点,那么抽象出左右两边应该怎么去放?思维~~~
代码:
typedef long long ll;
class Solution {
public:
int numTrees(int n) {
ll d[10010];
d[0]=d[1]=1;
for(int i=2;i<=n;i++){
d[i]=0;
for(int j=0;j<i;j++) d[i]+=1LL*d[j]*d[i-j-1];
}
return d[n];
}
};