无图无注释也能懂系列。
先处理乘除符号,再处理加减符号,数字只能是叶子节点。
思路:
用vector<Btree*>存贮每一个字符,然后遍历此数组,进行建树。
当建树完成,最后vector内只剩下树的根节点。
此代码只适用于数字是 个位数,如果需要处理多位数,拿去修改某些地方就可以了,主要的困难还是在于如何建树。
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef char ElemType;
typedef struct Btree{
ElemType data;
struct Btree *lchild;
struct Btree *rchild;
}Btree;
Btree *BuildTreeNode(char c){
Btree* t=(Btree*)malloc(sizeof(struct Btree));
t->data=c;
t->lchild=NULL;
t->rchild=NULL;
return t;
}
void InVect(vector<Btree*> &p,Btree *t){
p.push_back(t);
}
void BuildTreeNode(vector<Btree*> &p,string a){
Btree *t=NULL;
for(int i=0;i<a.size();i++){
t=BuildTreeNode(a[i]);
InVect(p,t);
}
}
void SetNode_Plus_Divide(vector<Btree*> &p){//处理过*和/后的vector
for(vector<Btree*>::iterator it=p.begin();it!=p.end();it++){
if((*it)->data=='*' || (*it)->data=='/'){//找到乘除号,直接作为根节点
Btree *left=*(it-1);
Btree *right=*(it+1);
(*it)->lchild=left;
(*it)->rchild=right;
p.erase(it-1);
p.erase(it);
}
if((*it)->data=='*' || (*it)->data=='/') it--;//边界条件,处理建树节点后两个乘除号相邻的情况。
if(it==p.end()) break;
}
}
void SetNode_Add_Reduce(vector<Btree*> &p){//处理过+和-后直到最后vector只剩下一个节点
while(p.size()!=1){
for(vector<Btree*>::iterator it=p.begin();it!=p.end();it++){
if((*it)->data=='+'|| (*it)->data=='-'){
if(!(*it)->lchild && !(*it)->rchild){
(*it)->lchild=*(it-1);
(*it)->rchild=*(it+1);
p.erase(it-1);
p.erase(it);
}
}
if(it==p.end()) break;
}
}
}
int cacul_Travel(Btree*t){//建树后,计算部分
if(!t) return 0;
if(((t->data<='9')&&(t->data>='1'))) return int(t->data-'0');//遇到数字返回
int left=0,right=0,result=0;
if(t->lchild){
if(!((t->lchild->data<='9')&&(t->lchild->data>='1')))
left=cacul_Travel(t->lchild);
else
left=int(t->lchild->data-'0');
}
if(t->rchild){
if(!((t->rchild->data<='9')&&(t->rchild->data>='1')))
right=cacul_Travel(t->rchild);
else
right=int(t->rchild->data-'0');
}
switch (t->data)
{
case '+':
result=left+right;
break;
case '-':
result=left-right;
break;
case '*':
result=left*right;
break;
case '/':
result=left/right;
break;
default:
break;
}
return result;
}
int cacul_result(vector<Btree*>p){
Btree* t=p[0];
return cacul_Travel(t);
}
int main()
{
string ar="1+2*3*4";
vector<Btree*> p_Node;
BuildTreeNode(p_Node,ar);
SetNode_Plus_Divide(p_Node);//处理乘除
SetNode_Add_Reduce(p_Node);//处理加减
cout<<"The result: ";
cout<<cacul_result(p_Node)<<endl;
system("pause");
}

本文介绍了一种使用C++实现表达式树的方法,通过构建二叉树来解析和计算数学表达式。首先将表达式的每个字符转化为树节点,接着通过两遍遍历来设置节点间的父子关系,最终通过递归遍历树来计算表达式的值。
7413

被折叠的 条评论
为什么被折叠?



