给定二叉树节点数求二叉树有几种形态

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

(2)如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,左右子树的分布情况为1=1+0=0+1,故有f(2) = f(1) + f(1)

(3)如果有三个节点,(我们需要考虑固定两个节点的情况么?当然不,因为当节点数量大于等于2时,无论你如何固定,其形态必然有多种)我们考虑固定一个节点,即根节点。好的,按照这个思路,还剩2个节点,那么左右子树的分布情况为2=2+0=1+1=0+2。
所以有3个节点时,递归形式为f(3)=f(2) + f(1)*f(1) + f(2)。(注意这里的乘法,因为左右子树一起组成整棵树,根据排列组合里面的乘法原理即可得出)

(4)那么有n个节点呢?我们固定一个节点,那么左右子树的分布情况为n-1=n-1 + 0 = n-2 + 1 = … = 1 + n-2 = 0 + n-1。此时递归表达式为f(n) = f(n-1) + f(n-2)f(1) + f(n-3)f(2) + … + f(1)f(n-2) + f(n-1)

接下来我们定义没有节点的情况,此时也只有一种情况,即f(0)=1
那么则有:
f(0)=1,f(1)=1
f(2)=f(1)f(0)+f(0)f(1)
f(3)=f(2)f(0)+f(1)f(1)+f(0)f(2)
.
.
.
.
f(n)=f(n-1)f(0)+f(n-2)f(1)+……….+f(1)f(n-2)+f(0)f(n-1)
该数列称为卡特兰数(Catalan数),该递推关系的解为:
这里写图片描述
即含n个节点的二叉树有f(n)种形态。


【其他使用Catalan数解决的问题】

(1)矩阵链乘:P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
(2)一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
(3)有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
(4)将一个凸多边形区域分成三角形区域的方法数?
(5)在圆上选择2n个点,将这些点成对连接起来,使得所得到的n条线段不相交的方法。
(6)一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

本文转载自:https://blog.csdn.net/adminabcd/article/details/46672759

### 回答1: 要求给定二叉树的叶结点数、结点数、高度,需要先遍历整棵二叉树,统计出叶结点数和结点数,然后再计算出高度。 叶结点数指的是没有子节点节点数,可以通过遍历二叉树,判断当前节点是否有左右子节点,如果没有则为叶结点结点数指的是整棵二叉树中所有节点的数量,可以通过遍历二叉树,每遍历到一个节点就加1来统计。 高度指的是从根节点到最深叶子节点的距离,可以通过递归遍历二叉树,每遍历到一个节点计算出它的左右子树的高度,然后取较大值再加1即可。 综上所述,求给定二叉树的叶结点数、结点数、高度需要遍历整棵二叉树,统计出相应的值。 ### 回答2: 二叉树是一种常见的树形结构,它由根节点、左子树、右子树组成。二叉树节点最多有两个子节点,分别是左子节点和右子节点。对于一个二叉树,我们通常需要求出它的叶结点数、结点数、高度,来了解它的特征。 首先是求二叉树的叶结点数。叶结点是没有子节点节点,也叫叶子节点。我们可以使用递归算法来求二叉树的叶结点数。具体实现方法如下: 1. 如果二叉树为空,则叶结点数为0。 2. 如果二叉树不为空,判断当前节点是否为叶子节点。 3. 如果当前节点是叶子节点,则叶结点数+1。 4. 如果当前节点不是叶子节点,则递归遍历它的左子树和右子树,分别计算左子树和右子树的叶结点数,并将它们相加,得到二叉树的总叶结点数。 其次是求二叉树结点数。结点数是指二叉树中所有节点的个数,包括根节点、左右子树以及它们的子节点。同样,我们可以使用递归算法来求二叉树结点数。具体实现方法如下: 1. 如果二叉树为空,则结点数为0。 2. 如果二叉树不为空,则将当前节点结点数设为1,并分别递归计算它的左子树和右子树的结点数。 3. 将当前节点结点数与左右子树结点数之和相加,得到整棵二叉树结点数。 最后是求二叉树的高度。高度是指从根节点到最深层节点的距离,也称为深度。我们同样可以使用递归算法来求二叉树的高度。具体实现方法如下: 1. 如果二叉树为空,则高度为0。 2. 如果二叉树不为空,则将当前节点的左子树高度和右子树高度分别递归计算。 3. 将当前节点的高度设为左右子树高度中的较大值,并将其值增加1,得到整棵二叉树的高度。 综上所述,求二叉树的叶结点数、结点数、高度可以使用递归算法来实现,这是一种简单且常用的做法。 ### 回答3: 对于给定二叉树,我们可以根据以下三个指标来进行计算: 一、叶结点二叉树的叶结点是没有子节点节点,因此计算结点数的方法是遍历整个二叉树,统计叶节点的数量。可以使用递归或迭代的方式来遍历二叉树,对每个节点判断它是否为叶节点,如果是,就将计数器加一。具体实现代码如下: int countLeaf(TreeNode* root) { if(root == NULL) return 0; if(root->left == NULL && root->right == NULL) return 1; return countLeaf(root->left) + countLeaf(root->right); } 二、结点二叉树结点数包括所有的节点,因此计算节点数的方法也是遍历整个二叉树,统计节点的数量。同样可以使用递归或迭代的方式来遍历二叉树,对每个节点将计数器加一即可。具体实现代码如下: int countNodes(TreeNode* root) { if(root == NULL) return 0; return countNodes(root->left) + countNodes(root->right) + 1; } 三、高度 二叉树的高度是指从根节点到最远叶结点所经过的边数。因为每个节点都有它自己的高度,所以可以使用递归的方法来计算二叉树的高度,因为对于每个节点来说,它的高度等于其左右子树中较大的那个加1。具体实现代码如下: int height(TreeNode* root) { if(root == NULL) return 0; return max(height(root->left), height(root->right)) + 1; } 综上所述,我们可以使用以上三个方法来计算给定二叉树的叶结点数、结点数、高度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值