Есть несколько хороших причин, почему деревья выражений часто являются двоичным:
- Наиболее распространенные деревья выражений представляют арифметические операции (
+
, -
, *
, /
) или логические предикаты (AND
, OR
, NOT
, XOR
). Существуют все двоичные (и унарные) операции, поэтому бинарные деревья имеют наибольший смысл. Вы могли иметь, например, n-ary +
, но это просто усложняет ситуацию без уважительной причины.
С более теоретической точки зрения, если у вас есть n-арное дерево, вы можете представить его, используя эквивалентное двоичное дерево, не теряя ничего. Использование п-арной +
пример следующие деревья (одна п-ичных и один двоичный) можно считать тот же:
+ +
/|\ /\
a b c + c
/\
a b
С другой стороны, есть библиотеки, которые используют п-арные деревья выражений где они имеют смысл. Например, деревья выражений C# (из пространства имен System.Linq.Expressions
) используют n-арные деревья для выражений вызова. Таким образом, выражение f(a, b, c)
будет представлен в виде InvocationExpression
который выглядит следующим образом:
f
/|\
a b c
Конечно, они могут ... но все n-арные деревья могут быть смоделированы как бинарные деревья, так зачем беспокоиться о дополнительной сложности? –
Значит ли это, что деревья выражений также могут быть выполнены с использованием n-деревьев? Поскольку везде, где я читал о деревьях выражений, я вижу только примеры двоичных деревьев. – LPD
Они могут быть, но в большинстве случаев это не обязательно, в зависимости от типов деревьев выражений, с которыми вы имеете дело. Если вам не нужно использовать n-арные деревья, тогда зачем беспокоиться? –