用于查找二叉树中叶节点数的数学函数

时间:2013-08-14 17:31:36

标签: algorithm data-structures binary-tree

有一个未知深度的不平衡二叉树。具有两个子节点的节点的数量由T2表示。仅具有一个子节点的节点由T1表示,叶节点由L表示。如果给出了T1 = mT2 = n个节点,那么你可以定义一个数学函数f(m, n),它给出了叶子节点数L?

例如,在下面的树中,T2个节点总数为m = 3T1个节点总数为n = 2。叶节点数L = f(m,n) = 4。你能找到一个数学函数f(m,n),它给出了所有树的叶子节点数量吗?

enter image description here

1 个答案:

答案 0 :(得分:8)

这很简单。在m个内部节点的完全二叉树(即每个非叶子有2个子节点)中,确实有m+1个叶节点。可以删除只有一个子节点的每个节点,并且您仍然拥有二叉树。因此,L中的叶节点数量仅为m+1。或回答问题:f(m, n) = m + 1

通过“删除T1节点”来举例说明我的意思可能很有用。考虑你的例子。右5只有一个孩子。如果我们删除5并将9直接放在2下,则不会更改叶子数。

如果我们对9执行相同的操作(将4直接放在2下),我们就会有一个完整的二叉树,即所有非叶子都有2个孩子

有关如何删除T1 类型的所有节点而不更改叶节点数的图解说明,请参阅图片。

enter image description here

剩下的就是证明在m个内部节点的树中,每个非叶子只有2个子节点,叶子节点的数量是m+1

通过归纳证明。归纳假设:|L| = |T2|+1

Base:树由单个节点组成。显然,|L|=1|T2|=0,所以它成立。

步骤:考虑一棵根不是叶子的树。根据假设,它有两个孩子,左和右。通过归纳假设:|Lleft|=|T2left| + 1|Lright| = |T2right| + 1。对于总树,我们有|T2| = |T2left| + |T2right| + 1|L| = |Lleft| + |Lright|。因此,|L| = |T2left| + 1 + |T2right| + 1 = |T2| + 1


替代证明

该属性也可以直接证明,没有删除T1节点的handwaving参数。同样,通过归纳,使用归纳假设|L| = |T2| + 1

  • 基础:树是单个节点,因此|L| = 1|T2| = 0
  • 第一种情况1 :树的根只有一个孩子,X,然后|L| = |LX||T2| = |T2X|,所以|L| = |T2| + 1 by归纳假设。
  • 步骤案例2 :树的根有两个孩子,左右。通过归纳假设:|Lleft|=|T2left| + 1|Lright| = |T2right| + 1。对于总树,我们有|T2| = |T2left| + |T2right| + 1|L| = |Lleft| + |Lright|。因此,|L| = |T2left| + 1 + |T2right| + 1 = |T2| + 1

因此,|L| = |T2| + 1或换句话说f(m, n) = m + 1