Aplicación del procesamiento de expresiones de árboles binarios

Como práctica de simulación y recursividad. Needle not poke 

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=50;
typedef int LL;
char str[10000];
typedef struct BitNode* ToNode;///ToNode是结构体指针
struct BitNode{
    char str;
    ToNode lchild;
    ToNode rchild;
};
ToNode BuildTree(LL l,LL r)
{
    ToNode p=(ToNode)malloc(sizeof(BitNode));
    p->lchild=nullptr;p->rchild=nullptr;
    if(l==r){
        p->str=str[l];
        ///cout<<"完成"<<endl;
        return p;
    }
    LL posk=0;LL pluss=0;
    for(LL i=l;i<=r;i++){
        if(str[i]=='+'||str[i]=='-'){
            pluss++;
            posk=i;///找最后一个+/-的位置,使之满足节点尽可能高,先乘除后加减
        }
    }
    if(pluss==0){
        for(LL i=l;i<=r;i++){
            if(str[i]=='*'||str[i]=='/'||str[i]=='X'){
                posk=i;
            }
        }
    }
    p->str=str[posk];
    p->lchild=BuildTree(l,posk-1);
    p->rchild=BuildTree(posk+1,r);
    return p;
}
void firstsearch(ToNode& L)
{
    cout<<(L->str);
    if(L->lchild!=nullptr) firstsearch(L->lchild);
    if(L->rchild!=nullptr) firstsearch(L->rchild);
}
void midsearch(ToNode& L)
{
    if(L->lchild) midsearch(L->lchild);
    cout<<(L->str);

    if(L->rchild) midsearch(L->rchild);
}
void finalsearch(ToNode &L)
{
    if(L->lchild){
        finalsearch(L->lchild);
    }
    if(L->rchild){
        finalsearch(L->rchild);
    }
    cout<<L->str;
}
double cal(ToNode &L)
{
    if(!(L->lchild)||!(L->rchild)){
        return (L->str-'0');
    }
    double sum1=1.0*cal(L->lchild);
    double sum2=1.0*cal(L->rchild);
    double sum3=0;
    if(L->str=='+'){
        sum3=sum1+sum2;
    }
    if(L->str=='-'){
        sum3=sum1-sum2;
    }
    if(L->str=='*'||L->str=='X'){
        sum3=sum1*sum2;
    }
    if(L->str=='/'){
        sum3=1.0*sum1/sum2;
    }
    return sum3;
}
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  cin>>(str+1);
  LL len=strlen(str+1);
  ToNode L=BuildTree(1,len);
  ///cout<<L->str<<endl;
  firstsearch(L);///先序遍历
  cout<<endl;
  midsearch(L);///中序遍历
  cout<<endl;
  finalsearch(L);///后序遍历
  cout<<endl;
  cout<<cal(L);
return 0;
}

Actualización: versión de dos dígitos

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=50;
typedef int LL;
char str[10000];
typedef struct BitNode* ToNode;///ToNode是结构体指针
///12+35+40
struct BitNode{
    char str;
    LL num;
    ToNode lchild;
    ToNode rchild;
};
bool check(LL l,LL r)
{
    for(LL i=l;i<=r;i++){
        if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='X'||str[i]=='/') return 0;
    }
    return 1;
}
LL getsum(LL l,LL r)
{
    LL sum=0;
    for(LL i=l;i<=r;i++){
        sum=sum*10+(str[i]-'0');
    }
    return sum;
}
ToNode BuildTree(LL l,LL r)
{
    ToNode p=(ToNode)malloc(sizeof(BitNode));
    p->lchild=nullptr;p->rchild=nullptr;
    if(check(l,r)==1){///判断区间内是否有符号
        ///p->str=str[l];
        p->num=getsum(l,r);
        ///cout<<"完成"<<endl;
        return p;
    }
    else if(l==r&&check(l,r)==0){
        p->str==str[l];
        return p;
    }
    LL posk=0;LL pluss=0;
    for(LL i=l;i<=r;i++){
        if(str[i]=='+'||str[i]=='-'){
            pluss++;
            posk=i;///找最后一个+/-的位置,使之满足节点尽可能高,先乘除后加减
        }
    }
    if(pluss==0){
        for(LL i=l;i<=r;i++){
            if(str[i]=='*'||str[i]=='/'||str[i]=='X'){
                posk=i;
            }
        }
    }
    p->str=str[posk];
    p->lchild=BuildTree(l,posk-1);
    p->rchild=BuildTree(posk+1,r);
    return p;
}
void firstsearch(ToNode& L)
{
    if(L->str=='+'||L->str=='-'||L->str=='*'||L->str=='X'||L->str=='/') cout<<L->str;
    else cout<<L->num;
    if(L->lchild!=nullptr) firstsearch(L->lchild);
    if(L->rchild!=nullptr) firstsearch(L->rchild);
}
void midsearch(ToNode& L)
{
    if(L->lchild) midsearch(L->lchild);
    if(L->str=='+'||L->str=='-'||L->str=='*'||L->str=='X'||L->str=='/') cout<<L->str;
    else cout<<L->num;

    if(L->rchild) midsearch(L->rchild);
}
void finalsearch(ToNode &L)
{
    if(L->lchild){
        finalsearch(L->lchild);
    }
    if(L->rchild){
        finalsearch(L->rchild);
    }
    if(L->str=='+'||L->str=='-'||L->str=='*'||L->str=='X'||L->str=='/') cout<<L->str;
    else cout<<L->num;
}
double cal(ToNode &L)
{
    if(!(L->lchild)||!(L->rchild)){
        return (L->num);
    }
    double sum1=1.0*cal(L->lchild);
    double sum2=1.0*cal(L->rchild);
    double sum3=0;
    if(L->str=='+'){
        sum3=sum1+sum2;
    }
    if(L->str=='-'){
        sum3=sum1-sum2;
    }
    if(L->str=='*'||L->str=='X'){
        sum3=sum1*sum2;
    }
    if(L->str=='/'){
        sum3=1.0*sum1/sum2;
    }
    return sum3;
}
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  cin>>(str+1);
  LL len=strlen(str+1);
  ToNode L=BuildTree(1,len);
  ///cout<<L->str<<endl;
  cout<<"先序遍历:"<<endl;
  firstsearch(L);///先序遍历
  cout<<endl;
  cout<<"中序遍历"<<endl;
  midsearch(L);///中序遍历
  cout<<endl;
  cout<<"后序遍历"<<endl;
  finalsearch(L);///后序遍历
  cout<<endl;
  cout<<cal(L);
return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/109793773
Recomendado
Clasificación