请求实现基于二叉树的简单符号方程求解器(附代码框架)
基于二叉树的符号方程求解器实现
下面是完成后的Node类代码,包含insert和evaluate方法的实现,完全符合你的需求:
class Node: def __init__(self): self.value = None # 存储(TYPE, VALUE)格式的元组 self.left = None self.right = None def insert(self, data): # 校验输入格式合法性 if not isinstance(data, tuple) or len(data) != 2: raise ValueError("输入必须是(TYPE, VALUE)格式的元组") node_type, node_value = data # 根节点未初始化时直接赋值 if self.value is None: self.value = data return # 操作数是叶子节点,不允许插入新元素 if self.value[0] == 'OPERAND': raise TypeError("操作数节点为叶子节点,无法插入新元素") # 运算符节点优先填充左子节点 if self.left is None: self.left = Node() self.left.insert(data) elif self.left.value[0] == 'OPERATOR': # 左子节点为运算符,递归插入左子树 self.left.insert(data) else: # 左子节点为操作数,填充右子节点 if self.right is None: self.right = Node() self.right.insert(data) elif self.right.value[0] == 'OPERATOR': self.right.insert(data) else: raise ValueError("当前运算符节点的左右子节点已填满") def evaluate(self): if self.value is None: raise ValueError("节点未初始化") node_type, node_value = self.value # 操作数直接返回数值 if node_type == 'OPERAND': return node_value # 运算符必须包含左右两个子节点 if self.left is None or self.right is None: raise ValueError("运算符节点必须包含左右两个子节点") left_val = self.left.evaluate() right_val = self.right.evaluate() # 执行对应运算 if node_value == '+': return left_val + right_val elif node_value == '-': return left_val - right_val elif node_value == '*': return left_val * right_val elif node_value == '^': return left_val ** right_val else: raise ValueError(f"不支持的运算符: {node_value}")
核心逻辑说明
- insert方法:
- 先校验输入格式,确保是合法的
(TYPE, VALUE)元组 - 根节点为空时直接赋值
- 操作数作为叶子节点,不允许插入新元素
- 运算符节点优先填充左子节点,左子节点为运算符时递归插入左子树;左子节点为操作数时再填充右子节点,右子节点为运算符时同样递归插入右子树
- 先校验输入格式,确保是合法的
- evaluate方法:
- 递归遍历二叉树,操作数直接返回数值
- 运算符节点先计算左右子节点的结果,再执行对应运算
- 处理了未初始化节点、运算符缺少子节点、未知运算符等异常情况
使用示例
# 构建表达式: 3 + (2 * 4) root = Node() root.insert(('OPERATOR', '+')) root.insert(('OPERAND', 3)) root.insert(('OPERATOR', '*')) root.insert(('OPERAND', 2)) root.insert(('OPERAND', 4)) print(root.evaluate()) # 输出: 11
内容的提问来源于stack exchange,提问作者jamitha rathnayaka
相关产品推荐
相关产品推荐

