如果需要c++的二叉树表达式求值,请参考这位作者
根据其代码原理可转换为以下C语言代码
#include <stdio.h>
#include <malloc.h>
#include<string.h>
int count=0; /*定义计算结点个数的变量*/
typedef struct tnode
{
char data;
struct tnode *lchild,*rchild;
}BT;
BT *BuildTree(char m[],int x,int y){//表达式建立树
/*此处表达式二叉树建立基本原理简述:
找表达式根结点(即优先级较低的运算符),
再以根结点位置拆分为左右表达式,左右再
反复找根结点,直到拆分为只剩下数字字符,
即是叶子结点 。则表达式树成
*/
int c1=-1,c2=-1,p=0,i;//c1,c2来记录运算符位置
BT *q;//新结点
q=(BT *)malloc(sizeof(BT));
int num=0;//记录数字字符
for(i=x;i<y;i++){//记录数字字符个数
if(m[i]>='0'&&m[i]<='9')
num++;
}
if(num==y-x){//递归停止部分 ,即叶子结点
++count;
q->data=m[x];
q->lchild=NULL;
q->rchild=NULL;
return q;
}
for ( i=x;i<y;i++){//寻找根结点位置
switch(m[i]){
case '(':p++;break;
case ')':p--;break;
/*p==0时,说明运算符在括号外,可以跳过括号,
找到括号外的运算符优先级较低的位置分别用
c1,c2来记录
*/
case '+':case '-':if(p==0)c1=i;break;
case '*':case '/':if(p==0)c2=i;break;
}
}
if(c1<0)c1=c2;//c1<0说明括号外没有+或-符号,令c1=c2,让c1始终代表优先级较低
if(c1<0){//c1<0再次出现说明,括号外再无运算符,则可以开始考虑括号里的内容
if(y-1>x+1)//判断括号里是否有字符再进行递归
return BuildTree(m,x+1,y-1);
/*
参数使用x+1,y-1,可以使在递归过程里达到去括号的"效果",
即只需考虑括号里表达式,括号不会影响
*/
}
count++;//记录结点数
q->data=m[c1];//存根结点
q->lchild=BuildTree(m,x,c1);//建立左子树
q->rchild=BuildTree(m,c1+1,y);//建立右子树
return q;
}
void PreOrder(BT *T) /* 先序遍历二叉树T*/
{ if(T==NULL) return; /* 递归调用的结束条件*/
else
{ printf("%c",T->data); /* 输出结点的数据域*/
PreOrder(T->lchild); /* 先序递归遍历左子树*/
PreOrder(T->rchild); /* 先序递归遍历右子树*/
}
}
int main(){
BT *T;
int x=0,y;
char a[20];
while(true){
printf("请输入表达式:");
scanf("%s",&a) ;
y=strlen(a);
T=BuildTree(a,x,y);
printf("先序遍历为:");
PreOrder(T);
printf("\n");
}
}
以下是运行截图
最后感谢原作者的分享,需要的小伙伴可以参考我转换后的C语言代码。