Вот моя трещина в решении.Я решил разбить алгоритм на две части.Сначала я сгенерировал случайную древовидную структуру с помощью операторов.Затем я прошел и добавил терминалы к текущим конечным узлам.
op = ['&',"|","+"]
terminals = ['a','b','c','d']
shuffle(op)
shuffle(terminals)
class tree:
def __init__(self, l, r, v):
self.left = l
self.right = r
self.value = v
root = tree(None, None, op[0])
op.pop(0)
def createNonTerminals(root):
if len(op) == 0:
return
choice = randint(0,1)
if choice == 0: #binary
root.left = tree(None, None, op[0])
op.pop(0)
if len(op) > 0:
root.right = tree(None, None, op[0])
op.pop(0)
createNonTerminals(root.right)
createNonTerminals(root.left)
else:
createNonTerminals(root.left)
else:
choice = randint(0, 1)
if choice == 1:
root.right = tree(None, None, op[0])
op.pop(0)
createNonTerminals(root.right)
else:
root.left = tree(None, None, op[0])
op.pop(0)
createNonTerminals(root.left)
def addNonTerminals(root):
if root.left == None:
root.left = tree(None, None, terminals[0])
terminals.pop(0)
else:
addNonTerminals(root.left)
if root.right == None:
root.right = tree(None, None, terminals[0])
terminals.pop(0)
else:
addNonTerminals(root.right)
Вот несколько примеров выходных данных
['+']
['&', 'd']
['~', 'f']
['a', '-']
['e', '|']
['b', 'c']
['|']
['&', '~']
['+', '-', 'b', 'a']
['d', 'f', 'e', 'c']