前言
这一次上机的题目就是将表达式二叉树进行相互转换。上一次说到了中缀表达式转后缀表达式,而这次是表达式二叉树转换成前中后缀表达式,只需要改变遍历方式即可。但是老师要只能使用栈。所以就需要保存结点。
需求分析
- 输入任意的前中后缀表达式,所以需要判断是哪一种表达式。
- 根据不同的表达式,建立同样的二叉树。再将二叉树表示出来。
- 按照用户输入,将二叉树转换成对应的表达式输出。
程序功能
将表达式转换成二叉树,再将二叉树转换成表达式。(本例子只能支持一位数的输入)
源代码
#include<stdio.h>
#include<string.h>
#include<iostream>
#define MaxSize 50
typedef int ElementType;
typedef struct bnode {
ElementType data;
struct bnode *l, *r;
}bnode, *btree;//bnode指向btree的指针
void DispTree(btree b);//显示一颗二叉树
//将前缀转换为二叉树
btree Pertree(char s[], int len) {
int i;
btree p, root;
//临时栈,用来存放指向树节点的指针
struct stack {
bnode *v[MaxSize];
int top;
};
struct stack q;
q.top = 0;
//遍历字符串
for (i = len-1; i >=0; i--) {
if ( s[i] == '+' || s[i] == '/' || s[i] == '*' || s[i] == '-'){
p = (btree)malloc(sizeof(bnode));
p->data = s[i];
p->r = q.v[q.top--];
p->l = q.v[q.top--];
q.v[++q.top] = p;//根节点入栈
}
else{
p = (btree)malloc(sizeof(bnode));
p->data = s[i];
p->l = NULL;
p->r = NULL;
q.v[++q.top] = p;//根节点入栈
}
}
root = q.v[q.top];
return root;
}
//将后缀转换成二叉树
btree PostTree(char s[], int len) {
int i;
btree p, root;
//临时栈,用来存放指向树节点的指针
struct stack {
bnode *v[MaxSize];
int top;
};
struct stack q;
q.top = 0;
//遍历字符串
for (i = 0; i < len; i++) {
if (s[i] == '+' || s[i] == '/' || s[i] == '*' || s[i] == '-') {
p = (btree)malloc(sizeof(bnode)