【杂谈】n个节点能组成多少个不同的二叉树

使用递归的思想解决这个问题

 

简单的例子:

当n=0时,没有树,为0

s(0)=0

当n=1时,显然

s(1)=1

当n=2时,一个根节点一个节点在左枝上,或者一个根节点一个节点在右枝上

s(2)=2

当s=3时,有根节点,然后左2右0,2种情况;左1右1,1种情况;左0右2,2种情况

s(3)=5

 

利用求s(3)的思想,求s(n)时,相当于一个根节点,然后左边 i 个节点组成一个二叉树,右边 j 个节点组成一个二叉树,

并且满足 i+j+1 = n,这样就得到递推公式:

s(n) = s(0)*s(n-1) + s(1)*s(n-2) + s(2)*s(n-3) + ...... + s(n-2)*s(1) + s(n-1)*s(0)

其中,定义s(0)=1,因为一边没有节点也算一种情况。

 

可以用cpp代码解决这个问题:

int n_tree(int n) {
    int save[n+1];
    save[0] = 1;
    save[1] = 1;
    save[2] = 2;
    for (int i = 3; i <= n; i++) {
        save[i] = 0;
        for (int j = 0; j <= i-1; j++)
            save[i] += save[j]*save[i-j-1];
    }
    return save[n];
}

 

根据递推公式,可以解出通解

s(n)=C(2n,n)/(n+1)

称之为catalan数,对此不做过多分析。

posted @ 2013-12-01 00:07  Azard  阅读(...)  评论(...编辑  收藏