有一个未知深度的不平衡二叉树。具有两个子节点的节点的数量由T2
表示。仅具有一个子节点的节点由T1
表示,叶节点由L
表示。如果给出了T1 = m
和T2 = n
个节点,那么你可以定义一个数学函数f(m, n)
,它给出了叶子节点数L?
例如,在下面的树中,T2
个节点总数为m = 3
,T1
个节点总数为n = 2
。叶节点数L = f(m,n) = 4
。你能找到一个数学函数f(m,n)
,它给出了所有树的叶子节点数量吗?
答案 0 :(得分:8)
这很简单。在m
个内部节点的完全二叉树(即每个非叶子有2个子节点)中,确实有m+1
个叶节点。可以删除只有一个子节点的每个节点,并且您仍然拥有二叉树。因此,L
中的叶节点数量仅为m+1
。或回答问题:f(m, n) = m + 1
。
通过“删除T1
节点”来举例说明我的意思可能很有用。考虑你的例子。右5
只有一个孩子。如果我们删除5
并将9
直接放在2
下,则不会更改叶子数。
如果我们对9
执行相同的操作(将4
直接放在2
下),我们就会有一个完整的二叉树,即所有非叶子都有2个孩子
有关如何删除T1
类型的所有节点而不更改叶节点数的图解说明,请参阅图片。
剩下的就是证明在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
。X
,然后|L| = |LX|
和|T2| = |T2X|
,所以|L| = |T2| + 1
by归纳假设。|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
。