Трансформация дерева выражений с использованием 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