【问题标题】:Recursive function to generate binary tree递归函数生成二叉树
【发布时间】:2019-10-30 19:03:51
【问题描述】:

我正在尝试创建一个函数“generate_tree(L)”,它接受一个字母列表并返回一个二叉树。每个字母都是一片叶子。 例如,使用列表:

L = ['A', 'B', 'C']

该函数应随机返回以下树之一:

['A',['B', 'C']] or [['A','B'], 'C'] 

第一个例子代表这棵树:

嗯,情况不太好 - 我有一个解决方案,但它也返回了很多空列表,而且一团糟。 这是我迄今为止的尝试:

from random import randint
def generate_tree(L):
    n = len(L)
    if not L: #base case yield empty
        yield L
        return
    randomSplit = randint(1,n-1)
    leftList = L[0:randomSplit]
    rightList = L[randomSplit:]

List = ['A','B','C']
list(generate_tree(L))

我对 randomSplit 的尝试是将列表分成两个随机非空位置的列表:

['A','B','C'] --> leftList: ['A'], rightList: ['B','C']

我知道我需要递归地发送 leftList 和 rightList,但我做不到。我很想你对这个问题的看法

【问题讨论】:

    标签: python recursion tree


    【解决方案1】:

    此解决方案选择一个随机拆分点并从那里向下划分列表:

    from random import randint
    
    def tree(lst):
        if len(lst) == 1:
            return lst[0]
        elif len(lst) <= 2:
            return lst
        else:
            ix = randint(1, len(lst) - 1)
            retval = [tree(lst[:ix]) , tree(lst[ix:])]
            return retval
    

    tree(['A','B','C']) 只产生两个必需的输出之一。

    示例输出来自:

    for _ in range(10):
        print(tree(['A','B','C','D']))
    
    [['A', 'B'], ['C', 'D']]
    [[['A', 'B'], 'C'], 'D']
    ['A', [['B', 'C'], 'D']]
    [['A', 'B'], ['C', 'D']]
    [['A', 'B'], ['C', 'D']]
    ['A', [['B', 'C'], 'D']]
    [['A', ['B', 'C']], 'D']
    [['A', ['B', 'C']], 'D']
    [[['A', 'B'], 'C'], 'D']
    ['A', ['B', ['C', 'D']]]
    

    【讨论】:

      【解决方案2】:

      我认为您的基本情况是列表长度为 2(或在特殊情况下更小),所以这是基于使用 random.randint 的想法:

      from random import randint
      
      def tree(lst):
          if len(lst) <= 2:
              return lst
          else:
              ix = randint(0, len(lst) - 1)
              retval = [lst[ix]]
              retval.append(tree(lst[:ix] + lst[ix+1:]))
              return retval
      

      它也适用于长度大于 3 或长度为 0 或 1 的列表。


      编辑:

      如果列表的第一个元素 必须 是第一个元素(如您的示例所建议的那样),则应该这样做:

      from random import randint
      
      def tree(lst):
          if len(lst) == 1:
              return lst[0]
          if len(lst) <= 2: # this matters is lst == []
              return lst
          else:
              ix = randint(1, len(lst) - 1)
              retval = [lst[:ix]] if ix > 1 else lst[:ix]
              retval.append(tree(lst[ix:]))
              return retval
      

      【讨论】:

      • 对于 ['A', 'B', 'C'] 的情况,您的函数可能会产生超出 OP 要求的两种替代方案的额外结果。
      猜你喜欢
      • 2013-06-05
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2016-07-24
      • 2013-07-23
      • 1970-01-01
      • 2016-04-19
      相关资源
      最近更新 更多