Это решение выбирает случайную точку разделения и делит список оттуда:
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']]]