Algorithm 一个数字作为叶节点显示多少次?

Algorithm 一个数字作为叶节点显示多少次?,algorithm,tree,binary-tree,binary-search-tree,Algorithm,Tree,Binary Tree,Binary Search Tree,假设您有一个由n个元素组成的数组 A={1,2,3,4,5} 总共5个!二元搜索树是可能的(不一定是不同的),现在我的问题是有多少树1显示为叶节点,有多少树2显示为叶节点,依此类推 我所尝试的: 我已经看到了A={1,2,3} 2显示6/3=2次 1出现2+1=3次 3出现2+1=3次 我能概括一下吗, 如果A={1,2,3,4} 2=24/4=6次 3=24/4=6次 1=6+1=7次 4=6+1=7次我们可以概括,但不是那样 您可以尝试排列阵列并生成所有可能的BST。在地图/字典数据结构中返

假设您有一个由n个元素组成的数组 A={1,2,3,4,5} 总共5个!二元搜索树是可能的(不一定是不同的),现在我的问题是有多少树1显示为叶节点,有多少树2显示为叶节点,依此类推

我所尝试的:

我已经看到了A={1,2,3}

2显示6/3=2次

1出现2+1=3次

3出现2+1=3次

我能概括一下吗, 如果A={1,2,3,4}

2=24/4=6次

3=24/4=6次

1=6+1=7次


4=6+1=7次

我们可以概括,但不是那样

您可以尝试排列阵列并生成所有可能的BST。在地图/字典数据结构中返回答案的蛮力方法应该不会那么难。首先编写一个函数,给定一个置换数组,查找所有叶子。它将第一个元素作为根,将小于根的所有元素发送到左侧,将大于根的所有元素发送到右侧,并为这两个元素递归调用此函数。然后,在组合这些值之后,它将返回

最后,对所有可能的排列组合值

python中一种可能的方法:

from itertools import permutations

def func(arr):
    if not arr: return {}
    if len(arr)==1: return {arr[0]}

    ans = set()
    left = func([v for v in arr[1:] if v<arr[0]])
    right = func([v for v in arr[1:] if v>=arr[0]])
    ans.update(left)
    ans.update(right)
    return ans

arr = [1,2,3,4]
ans = {i:0 for i in arr}
for a in permutations(arr):
    dic = func(a)
    print(a,":",dic)
    for k in dic:
        ans[k]+=1

print(ans)
对于
[1,2,3,4]
,只有最后一行,即答案是:

{1: 12, 2: 8, 3: 8, 4: 12}
对于
[1,2,3,4,5]
,它是:

{1: 60, 2: 40, 3: 40, 4: 40, 5: 60}
你能看到图案吗?最后一个例子。对于最多
6
,它是:

{1: 360, 2: 240, 3: 240, 4: 240, 5: 240, 6: 360}

在您的第一个示例中,请解释1如何出现3次…有6种可能的树绘制它们,您将得到答案!!是的,考虑所有的6棵树,即使我们知道有5棵不同的树是可能的,一个是重复的。是的,我得到了模式,很难找到它而不做程序。谢谢
{1: 360, 2: 240, 3: 240, 4: 240, 5: 240, 6: 360}