將二叉樹表示式按中綴表示式輸出,並加上相應的括號。
阿新 • • 發佈:2018-12-12
轉自:傾斜的正弦波
二叉樹的中序遍歷序列與原算術表示式基本相同,差別僅在於二叉樹表示中消除了括號。將中序序列加上括號就恢復原貌。當根結點運算子優先順序高於左子樹或右子樹根結點運算子時,相應左或右子樹前就需要加括號。
純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))