将二叉树表示的表达式二叉树按中缀表达式输出,并加上相应的括号。

本题是将符号算术表达式用二叉树表示的逆问题,即将二叉树表示的表达式还原成原表达式。二叉树的中序遍历序列与原算术表达式基本相同,差别仅在于二叉树表示中消除了括号。将中序序列加上括号就恢复原貌。当根结点运算符优先级高于左子树(或右子树)根结点运算符时,就需要加括号。
运行环境:Ubuntu18.04
编译工具 GCC


#include 
#include 
#include 

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;imalloc(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;
}

你可能感兴趣的:(数据结构与算法)