Это рекурсивный алгоритм, который я придумал. Я видел примеры алгоритмов, которые похожи на это в книгах.
f(n)
if n is an integer
return n
else
l = left child of n
r = right child of n
return f(l) n f(r)
Он может использоваться для оценки деревьев выражений, как показано на рисунке слева в выше изображение в течение Θ (n) времени. Пока это все правильно, я хочу расширить его для оценки деревьев выражений, таких как дерево справа, где общие подвыражения дедуплицированы. Я думаю, что алгоритм может правильно оценить эти типы деревьев, но я не уверен, сколько времени это займет. Возможно, какой-то метод хранения поддеревьев следует использовать? Например:
f(n, A)
if n is an integer
return node
else
if n has more than 1 parent AND n is in A (A is a list of stored subtrees)
return n from A
else
l = left child of n
r = right child of n
s = f(l, A) n f(r, A)
add s to list A
return s
Это расширение правильно? Это кажется действительно грязным. Кроме того, у меня есть ощущение, что он будет работать за O (n 2 ), потому что функция будет вызываться на n узлах, и во время каждого вызова ей придется выполнять итерацию по списку сохраненных узлов с верхней границей. из п. Можно ли сделать это лучше, чем в квадрати c раз?