假设您有一个包含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次
答案 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}