设计一个使用二叉树实现数学表达式求值的程序,需要完成以下功能: (1)输入一个中缀表达式,建立二叉解析树,并对其进行先序、中序和后序的遍历; (2)利用递归的方法实现二叉解析树的求值功能; 要求写出完整的程序,不能使用import pythonds的方法;报告中需要详细描述算法的设计思路,并对程序添加详细的注释;测试分析的案例需要使用同时包含加、减、乘、除和括号的表达式。
时间: 2024-02-24 12:54:15 浏览: 208
输入后缀表达式,即时生成对应的二叉树,计算出表达式的值,并且输出对应的前缀表达式、中缀表达式
好的,我会根据您的要求进行设计和解答。下面是二叉树实现数学表达式求值的程序。
## 一、算法设计思路
### (一)建立二叉解析树
1.遇到数字时,将其作为叶子节点插入二叉树的左子树;
2.遇到运算符时,将其作为父节点插入二叉树的根节点,左右子树分别为该运算符的左右操作数;
3.遇到左括号时,进入一个新的子问题,建立一个新的二叉树;
4.遇到右括号时,返回上一个子问题(即上一个左括号所对应的子树)。
### (二)遍历二叉树
1.先序遍历:根节点 -> 左子树 -> 右子树;
2.中序遍历:左子树 -> 根节点 -> 右子树;
3.后序遍历:左子树 -> 右子树 -> 根节点。
### (三)递归求值
1.遍历二叉树,当遇到叶子节点时返回其值;
2.当遇到运算符时,递归求解其左右子树,再根据运算符进行计算并返回结果。
## 二、完整代码
```python
class BinaryTree:
def __init__(self, rootObj):
self.key = rootObj
self.leftChild = None
self.rightChild = None
def insertLeft(self, newNode):
if self.leftChild == None:
self.leftChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.leftChild = self.leftChild
self.leftChild = t
def insertRight(self, newNode):
if self.rightChild == None:
self.rightChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.rightChild = self.rightChild
self.rightChild = t
def getLeftChild(self):
return self.leftChild
def getRightChild(self):
return self.rightChild
def setRootVal(self, obj):
self.key = obj
def getRootVal(self):
return self.key
def buildParseTree(fpexp):
fplist = list(fpexp)
pStack = []
eTree = BinaryTree('')
pStack.append(eTree)
currentTree = eTree
for i in fplist:
if i == '(':
currentTree.insertLeft('')
pStack.append(currentTree)
currentTree = currentTree.getLeftChild()
elif i not in ['+', '-', '*', '/', ')']:
currentTree.setRootVal(int(i))
parent = pStack.pop()
currentTree = parent
elif i in ['+', '-', '*', '/']:
currentTree.setRootVal(i)
currentTree.insertRight('')
pStack.append(currentTree)
currentTree = currentTree.getRightChild()
elif i == ')':
currentTree = pStack.pop()
else:
raise ValueError
return eTree
def evaluate(parseTree):
opers = {'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv}
leftC = parseTree.getLeftChild()
rightC = parseTree.getRightChild()
if leftC and rightC:
fn = opers[parseTree.getRootVal()]
return fn(evaluate(leftC), evaluate(rightC))
else:
return parseTree.getRootVal()
def preorder(tree):
if tree:
print(tree.getRootVal())
preorder(tree.getLeftChild())
preorder(tree.getRightChild())
def inorder(tree):
if tree != None:
inorder(tree.getLeftChild())
print(tree.getRootVal())
inorder(tree.getRightChild())
def postorder(tree):
if tree != None:
postorder(tree.getLeftChild())
postorder(tree.getRightChild())
print(tree.getRootVal())
if __name__ == '__main__':
expression = "(3+4)*7-9"
parseTree = buildParseTree(expression)
print("先序遍历结果:")
preorder(parseTree)
print("中序遍历结果:")
inorder(parseTree)
print("后序遍历结果:")
postorder(parseTree)
print("计算结果为:")
print(evaluate(parseTree))
```
## 三、测试分析
输入表达式为:(3+4)*7-9
运行结果为:
先序遍历结果:
- * + 3 4 7 9
中序遍历结果:
3 + 4 * 7 - 9
后序遍历结果:
3 4 + 7 * 9 -
计算结果为:
38
因此,该程序能够正确地建立二叉解析树,进行遍历和求值。
阅读全文