(数据结构)简单算术表达式二叉树的构建和求值

本文介绍了一种使用二叉树结构表示并计算简单算术表达式的方法。通过从右到左扫描表达式,优先寻找加减运算符,若不存在则寻找乘除运算符的方式构建二叉树。文章提供了完整的C++实现代码,包括树的创建、计算及销毁过程。

题目

编写一个程序,先用二叉树来表示一个简单算术表达式,树的每一个结点包括一个运算符或运算数。在简单算术表达式中只包含+、-、*、/和一位正整数且格式正确**(不包括括号)**,并且要按照先乘除后加减的原则构造二叉树,图7.34所示为1+2*3-4/5代数表达式对应的二叉树,然后由对应的二叉树计算该表达式的值。
在这里插入图片描述

分析

如上图所示的二叉树,就表示表达式1+2*3-4/5,如果我们需要计算他,就需要采用前序遍历的方法。
在这里插入图片描述

建树

如下图所示是随便构造的一颗二叉树
在这里插入图片描述
他表示的是表达式:5 + 2 - 1 * 2 / 5 + 3 + 2* 3
从图中可以发现:

  1. 所有的叶子节点都必须是数字。
  2. 所有的非叶子节点都是符号,而且都必须有左子树和右子树。
  3. 不可能会存在一个节点仅存在左子树而不存在右子树,或者仅存在右子树而不存在左子树的情况。
  4. + - 节点只存在于最左边,左孩子只能是+ - 或者数字,右孩子只能是* /或者数字
  5. * / 节点的右孩子只能是数字,左孩子只能是* /或者数字

第1 2 3条非常好理解,主要是第4条和第5条

第4条:因为我们计算的时候是采用前序遍历,前序遍历的顺序是自身、左子树、右子树,那么递归返回的顺序是右子树、左子树,乘法和除法的优先级高,所以必须要先算完乘除再算加减,所以加减号要放在左边

第5条:举个反例:
在这里插入图片描述
这个树表示1 / (2 * 5),而我们的表达式是不带括号的。

建树方法:从右往左扫描字符串,优先寻找+ -,如果不存在+ - 则寻找* /,如果都不存在,说明这是一个叶子节点。一旦寻找到了符号,都会利用该符号之前的子串来递归构建左子树,右边的子串会用来递归构建右子树。

代码

#include <bits/stdc++.h>
using namespace std;

struct TreeNode{
   
   
	int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int v){
   
   
        this->val = v;
        this->left = NULL;
        this->right = NULL;
    }
    TreeNode(char v,TreeNode* l,TreeNode *r){
   
   
        this->val = v;
        this->left = l;
        this->right = r;
    }
};

/*
string字符串转换成Int类型
*/
int stringToInt(string s){
   <
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值