```html <div> <p>使用枚举和模式匹配进行表达式树转换</p> </div> ```

Rust Hard enums

任务 «```html <div> <p>使用枚举和模式匹配进行表达式树转换</p> </div> ```»

给定一个用二叉树表示的算术表达式。树的每个节点要么是一个数字(叶子节点),要么是一个带有两个子节点的运算(加法、减法、乘法、除法)。需要实现一个函数,接收这样的树,并返回一棵根据以下规则简化后的新树:如果某个节点是运算,且它的两个子节点都是数字,则计算结果并将该节点替换为数字;如果某个子节点是数字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