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

转自:倾斜的正弦波

二叉树的中序遍历序列与原算术表达式基本相同,差别仅在于二叉树表示中消除了括号。将中序序列加上括号就恢复原貌。当根结点运算符优先级高于左子树或右子树根结点运算符时,相应左或右子树前就需要加括号。

纯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))

猜你喜欢

转载自blog.csdn.net/weixin_42034217/article/details/84970680
今日推荐