【问题标题】:How to generate random binary tree如何生成随机二叉树
【发布时间】:2020-06-26 04:19:23
【问题描述】:

给我一​​个标签列表L,我希望递归从L生成一个随机二叉树。

期望的行为是这样的:

generate(['A', 'B', 'C', 'D', 'E', 'F'])

可以给:

((('A', ('B', 'C')), ('D', 'E')), 'F')

注意叶子标签列表从左到右应该等于L。

我怀疑如何随机构造这棵树。这就是我目前所拥有的(我在随机索引处拆分标签列表。

def generate_tree(L):
    split = randint(1, len(L)-1)
    left = L[:split]
    right = L[split:]

    # call generate(left) and generate(right) based on some conditions

我被困住了。如果您能给我一些提示或帮助,我将不胜感激。

【问题讨论】:

  • 你的二叉树看起来不是随机的
  • @kederrac 你是什么意思?我还没有生成一个。我提供的示例只是可能输出的示例。
  • @kederrac 因为从左到右的叶子标签列表应该等于L,我猜你可以说它不是完全随机的。
  • 为什么不随机排序?即使它必须是有序树,您也可以随机化插入顺序
  • 如果结果是嵌套列表而不是元组就可以了吗?

标签: python python-3.x recursion binary-tree


【解决方案1】:

您可以对列表进行随机切片,然后递归应用树构造:

import random
def r_tree(d):
   _l, _r = tuple(d[:(_n:=random.randint(0, len(d)-1))]), tuple(d[_n+1:])
   l, r = _l if len(_l) < 3 else r_tree(_l), _r if len(_r) < 3 else r_tree(_r)
   return (d[_n], n[0] if len(n:=tuple(filter(None, [l, r]))) == 1 else n)

print(r_tree(['A', 'B', 'C', 'D', 'E', 'F']))

输出:

('D', (('A', ('B', 'C')), ('E', 'F')))

【讨论】:

  • 恕我直言,如果代码不那么密集,这个答案会收获很多......
【解决方案2】:

你离得太远了。您所需要的只是一个基本案例并根据递归调用的结果构建结果元组:

def generate_tree(L):
    # base case
    if len(L) == 1: 
        return L[0]
    split = randint(1, len(L)-1)
    left = L[:split]
    right = L[split:]
    # recursion
    return (generate_tree(left), generate_tree(right))

>>> generate_tree(['A', 'B', 'C', 'D', 'E', 'F'])
(('A', 'B'), (('C', 'D'), ('E', 'F')))
>>> generate_tree(['A', 'B', 'C', 'D', 'E', 'F'])
((('A', 'B'), 'C'), (('D', 'E'), 'F'))
>>> generate_tree(['A', 'B', 'C', 'D', 'E', 'F'])
('A', (('B', 'C'), (('D', 'E'), 'F')))

如果您正在打代码并寻找花哨的(仅>=3.8)单线:

def gt(L):
    return (gt(L[:(s:=randint(1, len(L)-1))]), gt(L[s:])) if len(L) > 1 else L[0]

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多