前言
最近在系统复习刷题单,做到了本应滚瓜烂熟的表达式转换的题,忘记了出栈入栈的规则,调了很久也没有过。
最后怒写了一棵表达式树过了,个人认为这个方法便于记忆,也比较好写。
代码
核心流程就是在区间中寻找最后一个运算的运算符,然后将这个运算符作为根,递归左右区间进行建树,叶子节点全部为操作数。
如果区间内不存在运算符,就一定只有一个数字,读入数字作为叶子节点。
代码:以洛谷P1175为例
#include <bits/stdc++.h>
using namespace std;
string s1;
int pr;
int len;
int cnt;
struct node{
int now;
int lson;
int rson;
int flag;
int val;
char ch;
}node[100005];
int build(int l,int r){
cnt++;
int now1=cnt;
node[cnt].now=cnt;
int min1=1000;
int min2=0;
int pr=0;
for(int i=l;i<=r;i++){
//寻找最后一个运算的运算符
if(s1[i]=='-'||s1[i]=='+'){
if(pr<=min1){
min1=pr;
min2=i;
}
}
else if(s1[i]=='*'||s1[i]=='/'){
if(pr+1<=min1){
min1=pr+1;
min2=i;
}
}
else if(s1[i]=='^'){
if(pr+2<=min1){
min1=pr+