转自:倾斜的正弦波
二叉树的中序遍历序列与原算术表达式基本相同,差别仅在于二叉树表示中消除了括号。将中序序列加上括号就恢复原貌。当根结点运算符优先级高于左子树或右子树根结点运算符时,相应左或右子树前就需要加括号。
纯C代码:
#include <stdlib.h>
#include <stdio.h>
typedef struct Node{
char data;
struct Node *lchild;
struct Node *rchild;
}BTNode;
///建立树
BTNode* CreatExpressionTree(char data[],int num)
{
BTNode *p=NULL;
int i=0;
BTNode* Stack[20];
int top=-1;
for(i=0;i<num;i++)
{
p=(BTNode *)malloc(sizeof(BTNode));
p->rchild=p->lchild=NULL;
p->data=data[i];
if(p->data<='z' && p->data>='a')
{
Stack[++top]=p; //p->data为小写字母
}
else {
p->rchild=Stack[top--];
p->lchild=Stack[top--];
Stack[++top]=p;
}
}
return Stack[0];
}
/// 比较运算符级别高低,optr1级别高于optr2时返回1,相等时返回0,低于时返回-1
int Precede(char optr1,char optr2)
{
switch(optr1)
{
case'+':case'-':
if(optr2=='+'||optr2=='-')
{
return(0);
}
else
{
return(-1);
}
case'*':case'/':
if(optr1=='*'||optr2=='/')
{
return(0);
}
else
{
return(1);
}
}
}
//输出二叉树表示的算术表达式,设二叉树的数据域是运算符或变量名
void InorderExp (BTNode *bt)
{
int bracket;
if(bt)
{
if(bt->lchild!=NULL)
{
bracket=Precede(bt->data,bt->lchild->data);//比较双亲与左子树运算符优先级
if(bracket==1)
{
printf("(");
}
InorderExp(bt->lchild); //输出左子树表示的算术表达式
if(bracket==1)
{
printf(")"); //加上右括号
}
}
printf("%c",bt->data); //输出根结点
if(bt->rchild!=NULL) //输出右子树表示的算术表达式
{
bracket=Precede(bt->data,bt->rchild->data);
if (bracket==1)
{
printf("(");
} //右子树级别低,加括号
InorderExp (bt->rchild);
if(bracket==1)
{
printf(")");
}
} }
}//结束Inorder Exp
int main()
{
BTNode *root=NULL;
char data[]={"ab/cd*+ef/+g+"}; //任意的后缀表达式
int num;
num=strlen(data);
root=CreatExpressionTree(data,num);
InorderExp(root);
return 0;
}
2017年408:
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括
号反映操作符的计算次序)并输出。例如,当下列两棵表达式作为算法的输入时:
输出的等价中缀表达式分别为(a+b)*(c+(-d))和(a*b)+(-(-c-d))