如果输入序列是表达式(前缀表达式、中缀表达式、后缀表达式,中缀表达式要求带括号有几个运算符就带几个)则构建出来的树为表达式树,对该树前、中、后序遍历得到对应序的表达式。
不过,中缀表达式带括号,而表达式树不带括号,故中序遍历表达式树时需要加适当的括号才能得到正确的中缀表达式。
1、表达式树的构建与遍历
0、工具函数(链表节点定义、读取下一个字符、判断字符是否操作数):
1 typedef structnode2 {3 chardata;4 struct node *lchild;5 struct node *rchild;6 }BTNode,*BTREE;7
8
9 char nextToken(char infix[])//括号、操作数、操作符等 都为一个字符
10 {11 static int pos=0;12 while(infix[pos]!='\0' && infix[pos]==' '){pos++;}//跳过空格
13 return infix[pos++];14 }15 int isOpNum(char ch)//是否是操作数
16 {17 if(ch=='#' || ch=='(' || ch==')' || ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch==' ' || ch=='|')18 {19 return 0;20 }21 return 1;22 }
View Code
1、输入前缀表达式构建表达式树(递归):
1 void createPrefix_recursive(char prefix[],BTREE &T)2 {//递归方式_由前缀表达式构建表达式树
3 char x=nextToken(prefix);4
5 T=(BTREE)malloc(sizeof(BTNode));6 T->data=x;7 T->lchild=NULL;8 T->rchild=NULL;9
10 if(!isOpNum(x))//是操作符。前缀表达式的最后一个字符一定是操作数,所以下面的递归会