Представьте, что вы определяете, что дерево должно отображаться следующим образом, например: "<1#<<2#3>#<4#5>>>"
. Складывание такого дерева означает замену каждого узла ветви фактической поставленной операцией, которая должна быть выполнена по результатам рекурсивно выполненной складки на составляющих типа данных (здесь два дочерних узла узла, которые сами по себе, каждое дерево) например, с +
, производя (1+((2+3)+(4+5)))
.
Итак, для листьев вы должны просто взять значения внутри них и для ветвей, рекурсивно применить сгиб для каждого из двух, и объединить два результата с прилагаемой функцией, той, с которой дерево сложенный. (Редактировать:) Когда вы принимаете значения из листьев, вы можете их дополнительно преобразовать, применяя унарную функцию. Так что в общем случае для вашего складывания понадобится два пользовательских функций, один для оставляет, а другой - для комбинирования результатов рекурсивно складывания в процентах от веток.
Тип данных дерева может быть определен по-разному, например. с возможными пустыми листьями, а также с внутренними узлами, несущими значения. Затем вам нужно будет указать значение по умолчанию вместо пустых листовых узлов и трехпозиционную комбинацию.
Другое различие реализовать здесь, , что вы сложите и как вы сложите его. То есть вы могли бы сложить свое дерево в линейном моде, (1+(2+(3+(4+5))))
, или вы могли бы свернуть линейный список в древовидный моды. Это все о том, как вы вставляете в скобки результат «выражение». Конечно, в классическом исполнении складывается структура exression следует за структурой структуры, которая складывается; но variations do exist. Заметим также, что операция объединения может быть не строгой, и она может потреблять/производить состав, а также атомные значения.
Теперь, когда вопрос достаточно стар, было бы неплохо увидеть полный ответ, для тех, кто хочет учиться, и не имеет домашней работы. –