一个数字作为叶子节点出现多少次?

时间:2017-11-12 13:22:18

标签: 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次

1 个答案:

答案 0 :(得分:0)

我们可以概括,但不是这样。

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

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

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]输出:

(1, 2, 3) : {3}
(1, 3, 2) : {2}
(2, 1, 3) : {1, 3}
(2, 3, 1) : {1, 3}
(3, 1, 2) : {2}
(3, 2, 1) : {1}
{1: 3, 2: 2, 3: 3}

对于[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}