Java 一个数学函数,它能让我们得到一种特殊类型的k元的叶子数?

Java 一个数学函数,它能让我们得到一种特殊类型的k元的叶子数?,java,math,tree,Java,Math,Tree,我试图找出一个函数f(x),它可以计算k叉树的叶子数。例如,假设我们创建了一个以根4开始的树,它有3个子元素,每个子元素分别为-1、-2、-3。我们的叶子只有0个值,而不是空值。我花了一天的时间试图找出一个函数,但似乎我所做的一切都没有朝着正确的方向发展 例: 7片叶子 任何帮助都将不胜感激!谢谢 为了澄清这一点,我需要一个数学方程,它可以导出与递归遍历树时的代码相同的答案 更多示例: {4,7}{5,13}{6,24}{7,44}{8,81}{9149}{10274}{11504}{12927

我试图找出一个函数f(x),它可以计算k叉树的叶子数。例如,假设我们创建了一个以根4开始的树,它有3个子元素,每个子元素分别为-1、-2、-3。我们的叶子只有0个值,而不是空值。我花了一天的时间试图找出一个函数,但似乎我所做的一切都没有朝着正确的方向发展

例:

7片叶子

任何帮助都将不胜感激!谢谢

为了澄清这一点,我需要一个数学方程,它可以导出与递归遍历树时的代码相同的答案

更多示例: {4,7}{5,13}{6,24}{7,44}{8,81}{9149}{10274}{11504}{12927}{131705}{143136}{1610609}{1719513}{1835890}{1966012}{20121415}

 public int numleaves(TreeNode node) {
    if (node == null)
        return 0; 
    else if (node.getLeft() == null && node.getMiddle() == null && node.getRight() == null)
        return 1; 
    else
        return numleaves(node.getLeft()) + numleaves(node.getMiddle()) + numleaves(node.getRight());
}

我没办法,但我看到了二叉树


我认为好的近似值可以是pascal三角形第k行的和,其中k代表根节点的数目。

我不能回答你的问题,但它有一个值。我只能概述儿童的数量
k
等于
2
的情况。如果
k=3
得到一个三次多项式,它有两个复数解和一个实解,我这里缺少用非数值方法推导它们的工具

但是让我们来看看案例
k=2
。有趣的是,这个问题与斐波那契数密切相关,只是边界条件不同

写下递归公式很容易:

a(n) = a(n-1) + a(n-2)
边界条件为
a(1)=1
a(0)=1
。其特征多项式是

x^2 = x + 1
使用解决方案
x1=1/2+sqrt(5)/2
x2=1/2-sqrt(5)/2
。意思是

a(n) = u*x1^n + v*x2^n
对于一些
u
v
是我们正在寻找的序列的显式公式。加入我们得到的边界条件

u = (sqrt(5)+1)/(2*sqrt(5))
v = (sqrt(5)-1)/(2*sqrt(5))
i、 e


对于
k=2

而言,您的代码似乎正在使用起始值
1
1
2
计算a。这是来自在线整数序列百科全书,从该序列的第三个条目开始,而不是从第一个条目开始。百科全书页面的注释部分给出了一个明确的公式:因为这是一个3次特征多项式的线性递推关系,所以根据该多项式的根有一个封闭形式的解。下面是一小段Python 2代码,它基于生成前几个值的给定公式。(有关简化信息,请参见下面的编辑。)

以及输出:

0 1
1 1
2 2
3 4
4 7
5 13
6 24
7 44
8 81
9 149
10 274
11 504
12 927
13 1705
14 3136
15 5768
16 10609
17 19513
18 35890
19 66012
20 121415

编辑:上面的代码是不必要的复杂。通过
round
操作,可以省略
f(n)
中的第二项(随着
n
的增加,它收敛到零),并且可以简化第一项的公式。下面是一些生成相同输出的简单代码

s = (19 + 297**0.5)**(1/3.)
c = (1 + s + 4/s)/3
j = 3 - (2 + 1/c)/c
for n in range(0, 32):
    print n, int(round(c**n / j))

这不是更容易理解吗:

我们将Tribonaci序列的起始值设置到一个名为result的列表中。然后我们将这些值放入3个变量中。我们根据Tribonaci公式更改变量内容(新a为a+b+c,新b为旧a,新c为旧b)。然后我们计算出我们想要达到的Tribonaci数,并将每个结果存储到结果列表中。最后,我们读出索引列表

result=[1,1,2]
a,b,c=result[-1],result[-2],result[-3]
for i in range(40):
    a,b,c=a+b+c,a,b
    result.append(a)
for e,f in enumerate(result):
    print e,f

那么,指定要计算的当前树状态将是一个相当大的技巧?(你需要整棵树,而不仅仅是k和n,才能知道有多少叶是正确的)?(简单地说:1递归,n处计数=(2*n-1处计数)+1。上面的一些计算是不正确的(例如,我认为应该是{5,15})。这不起作用。
{5,13}
是正确的。请您澄清一下,您有递归代码,但您只对结果的数学推导感兴趣?如果可能的话,是的,例如,如果我们创建了根为6的树,我正在寻找一个函数,如果我插入x,将给出准确的叶数。如果我这毫无帮助。
0 1
1 1
2 2
3 4
4 7
5 13
6 24
7 44
8 81
9 149
10 274
11 504
12 927
13 1705
14 3136
15 5768
16 10609
17 19513
18 35890
19 66012
20 121415
s = (19 + 297**0.5)**(1/3.)
c = (1 + s + 4/s)/3
j = 3 - (2 + 1/c)/c
for n in range(0, 32):
    print n, int(round(c**n / j))
result=[1,1,2]
a,b,c=result[-1],result[-2],result[-3]
for i in range(40):
    a,b,c=a+b+c,a,b
    result.append(a)
for e,f in enumerate(result):
    print e,f