N个节点的二叉树有多少种形态

简介: 来源:http://www.cnblogs.com/ShaneZhang/p/4102581.html 这是一道阿里的面试题。其实算不上新鲜,但是我之前没关注过,如今碰到了,就顺便探讨下这个问题吧:) 拿到这个题,首先想到的是直接写出表达式肯定不行,所以有必要从递推入手。

来源:http://www.cnblogs.com/ShaneZhang/p/4102581.html

这是一道阿里的面试题。其实算不上新鲜,但是我之前没关注过,如今碰到了,就顺便探讨下这个问题吧:)

拿到这个题,首先想到的是直接写出表达式肯定不行,所以有必要从递推入手。由特殊到一般,归纳法么~而且二叉树离不开递推这个尿性。。。

 

先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1

如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,有两种情况,一是左子树还剩一个节点,此刻类型数量为f(1),第二种情况是右子树生一个节点,此刻类型数量为f(1),固有f(2) = f(1) + f(1)

如果有三个节点呢?我们需要考虑固定两个节点的情况么?当然不行,为什么?

因为当节点数量大于等于2时,无论你如何固定,其形态必然有多种,而在这多种基础之上你如何安排后续剩下的节点呢?所以必须挑出这个误区。

回到二叉树的定义,二叉树本质上就是一个递归的形式,左子树,右子树,根节点。所以根节点应该不变,需要递归处理的是左右子树。

也就是说,还是考虑固定一个节点,即根节点。好的,按照这个思路,还剩2个节点,那么左右子树的分布情况为2=0+2=1+1=2+0。

所以有3个节点时,递归形式为f(3)=f(2) + f(1)*f(1) + f(2). (注意这里的乘法,因为左右子树一起组成整棵树,根据排列组合里面的乘法原理即可得出)

那么有n个节点呢?我们固定一个节点,那么左右子树的分布情况为n-1=n-1 + 0 = n-2 + 1 = ... = 1 + n-2 = 0 + n-1

OK。递归表达式出来了f(n) = f(n-1) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)

 

观察一下这个表达式,嗯,和我们之前见过的递归表达有一点区别,递推层级为n的时候,更多的是考虑前一步(n-1),或者前两步(n-1)和(n-2)。

但是这里却考虑到所有的情况,即1到n-1。

最后说明一下,这个表达式有一个学名,叫做Catalan数。上面我们没有定义f(0)。如果把f(0)也考虑进去,显然没有节点也只有一种情况,即f(0)=1

标准表达式为f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)f(0)

前几个数为1,1,2,5,14,42,132。

此外,还有一个通项公式为1/(n+1) * C(n, 2n) = C(n, 2n) - C(n-1, 2n) , n = 0,1,2,...

有兴趣的同学可以参考组合数学相关书籍,这里就不累述其证明和推导了。

 

 

关于这个问题的一些论述:

http://www.cnblogs.com/hujunzheng/p/5040334.html

http://blog.csdn.net/wty__/article/details/12950131

关于卡特兰数:

http://www.cnblogs.com/wuyuegb2312/p/3016878.html

http://blog.csdn.net/hackbuteer1/article/details/7450250

相关文章
|
6月前
|
存储
树的存储结构以及树,二叉树,森林之间的转换
树的存储结构以及树,二叉树,森林之间的转换
29 0
|
6月前
|
算法
【每日一题Day235】LC1483树节点的第 K 个祖先 | 倍增
【每日一题Day235】LC1483树节点的第 K 个祖先 | 倍增
49 1
|
6月前
leetcode-5944:从二叉树一个节点到另一个节点每一步的方向
leetcode-5944:从二叉树一个节点到另一个节点每一步的方向
55 0
计算左子树规模(结点个数),找出树的根结点
简单的计算公式教你找出左子树到底有多少个娃,也会与你一起寻找根结点,快来看看呀
计算左子树规模(结点个数),找出树的根结点
|
算法
【数据结构与算法】二叉树的深度,节点数,第k层的节点数,遍历,二叉树叶节点的个数
【数据结构与算法】二叉树的深度,节点数,第k层的节点数,遍历,二叉树叶节点的个数
247 0
|
数据安全/隐私保护
列出叶节点 (二叉树的建立和BFS)
列出叶节点 (二叉树的建立和BFS)
91 0
二叉树的前中后序遍历以及求深度、叶子节点和二叉树的重建
二叉树的前中后序遍历以及求深度、叶子节点和二叉树的重建
70 0
|
算法 JavaScript 开发者
寻找二叉树的下一个节点
寻找二叉树的下一个节点
寻找二叉树的下一个节点
|
存储 机器学习/深度学习 算法
【数据结构和算法】树的特点&树的存储结构&二叉树的遍历与创建&二叉树的高度节点计算
【数据结构和算法】树的特点&树的存储结构&二叉树的遍历与创建&二叉树的高度节点计算
239 0
【数据结构和算法】树的特点&树的存储结构&二叉树的遍历与创建&二叉树的高度节点计算