解题思路编写一个实验程序,给定一个字符串str,包含一个简单算术表达式的后缀表达式 (仅包含正整数和'+'、'-'、'* '、/'运算符)。完成以下任务: (1)将后缀表达式采用二叉树表示(称为表达式树)。例如一 个后缀表达式str="10#3# -3#5#2#/ * +"对应的二叉树表 示如图7. 48所示。 (2)采用括号表示法输出该表达式树。 (3)利用该表达式树求出表达式的值,上述表达式树的求值 结果是14.5。 (4)将该表达式树转换为中缀表达式并输出。
时间: 2023-06-05 18:06:33 浏览: 207
1 2 + 4 * 3 /",其对应的表达式树如下所示:
```
/
/ \
* 3
/ \
+ 4
/ \
10 12
```
(2)对表达式树进行后序遍历,将表达式结果输出。对于上面的表达式树,输出结果为: 6
解题思路:
1. 采用栈结构来实现后缀表达式的计算,并通过二叉树表示出这个后缀表达式。
2. 遍历后缀表达式的字符,将数字和运算符依次入栈。
3. 遇到数字时,将数字节点入栈;遇到运算符时,弹出栈顶的两个数字节点,并将运算符当做该节点的值,然后将该节点入栈。
4. 遍历结束后,栈中只剩一个根节点,完成对表达式树的构建。
5. 对表达式树进行后序遍历,得出表达式的结果。
代码如下:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
def build_expression_tree(str):
stack = []
for ch in str:
if ch.isdigit():
stack.append(TreeNode(int(ch)))
elif ch in "+-*/":
node = TreeNode(ch)
node.right = stack.pop()
node.left = stack.pop()
stack.append(node)
return stack.pop()
def evaluate_expression_tree(root):
if not root:
return 0
left_val = evaluate_expression_tree(root.left)
right_val = evaluate_expression_tree(root.right)
if root.val == "+":
return left_val + right_val
elif root.val == "-":
return left_val - right_val
elif root.val == "*":
return left_val * right_val
elif root.val == "/":
return left_val / right_val
else:
return root.val
# test the functions
str = "10 12 + 4 * 3 /"
root = build_expression_tree(str)
assert evaluate_expression_tree(root) == 6
```
阅读全文