1. 程式人生 > >將二叉樹表示式按中綴表示式輸出,並加上相應的括號。

將二叉樹表示式按中綴表示式輸出,並加上相應的括號。

轉自:傾斜的正弦波

二叉樹的中序遍歷序列與原算術表示式基本相同,差別僅在於二叉樹表示中消除了括號。將中序序列加上括號就恢復原貌。當根結點運算子優先順序高於左子樹或右子樹根結點運算子時,相應左或右子樹前就需要加括號。

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