【问题标题】:How many times a number appears as a leaf node?一个数字作为叶节点出现多少次?
【发布时间】:2017-11-12 13:22:17
【问题描述】:

假设你有一个包含 n 个元素的数组 A = {1,2,3,4,5} 一共5个!二叉搜索树是可能的(不一定不同)现在我的问题是有多少棵树 1 出现为叶节点,有多少棵树 2 出现为叶节点等等?

我尝试过的:

我见过 A = {1,2,3}

2 出现 6/3 = 2 次​​p>

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 如何出现 3 次...
  • 有 6 种可能的树绘制它们,你会得到答案!是的,考虑所有 6 棵树,即使我们知道其中 5 棵不同的树是可能的,而其中的一棵是重复的。

标签: algorithm tree binary-tree binary-search-tree


【解决方案1】:

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

您可以尝试排列数组并生成所有可能的 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],它输出:

(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}

【讨论】:

  • 是的,我得到了不编写程序很难找到的模式。谢谢!!
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多