Трансформация дерева выражений с использованием enum и pattern matching

Rust Сложный enums

Задача «Трансформация дерева выражений с использованием enum и pattern matching»

Дано арифметическое выражение, представленное в виде бинарного дерева. Каждый узел дерева — это либо число (лист), либо операция (сложение, вычитание, умножение, деление) с двумя потомками. Необходимо реализовать функцию, которая принимает такое дерево и возвращает новое дерево, упрощённое по следующим правилам: если узел — операция, и оба его потомка — числа, вычислить результат и заменить узел на число; если один из потомков — число 0 и операция — умножение, заменить узел на 0; если один из потомков — число 0 и операция — сложение, заменить узел на другой потомок; если операция — деление, и делитель — число 1, заменить узел на делимое; если операция — вычитание, и оба потомка равны, заменить узел на число 0. Применять рекурсивно, пока возможно. Гарантируется, что все операции целочисленные, деление целочисленное с округлением вниз. Входные данные: сначала число n — количество узлов. Затем n строк, каждая в формате: тип узла ("num" или "op"), для "num" — значение (целое), для "op" — символ операции ('+', '-', '*', '/') и два целых числа — индексы левого и правого потомков (0-индексация). Корень всегда имеет индекс 0. Вывести: для каждого узла после упрощения вывести его тип и значение/операцию в том же формате (порядок узлов — как в исходном дереве, даже если узел стал числом, сохранить его индекс). Если узел стал числом, вывести "num значение"; если остался операцией, вывести "op символ левый_индекс правый_индекс" (индексы потомков — из упрощённого дерева).

Формат ввода

Целое n (1 ≤ n ≤ 1000). Затем n строк: для числа: "num x"; для операции: "op op_symbol left right".

Формат вывода

n строк: для каждого узла в исходном порядке: "num value" или "op symbol left right".

Примеры

Пример 1

ВВОД
3 num 5 num 3 op + 0 1
ВЫВОД
num 5 num 3 op + 0 1

Пример 2

ВВОД
cat dog elephant bird
ВЫВОД
cat dog bird elephant

Пример 3

ВВОД
5 num 0 num 7 op * 0 1 num 2 op + 2 3
ВЫВОД
num 0 num 7 op * 0 1 num 2 op + 2 3

Пример 4

ВВОД
a ab abc abcd
ВЫВОД
a ab abc abcd
main.rs