PAT Advanced Level 1162 Postfix Expression(25)
题目链接🔗
需要注意的一点是:并不是单纯的后序遍历就可以了。由于是要打印后缀表达式,所以如果一个结点没有左孩子,那就要先打印该节点的值。
例如3+4
这个表达式是中序表达式,写成后序表达式就是34+
,这样写是因为+
是一个二元运算符,3和4是它的两个操作数。但是对于-3
,-
就变成了一元操作符,因此需要在3前面打印出来。
代码如下(非递归后序遍历):
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stack>
#include <string.h>
using namespace std;
#define N 25
int n,root;
struct node{
char data[15];
int lch=-1,rch=-1;
bool isPrinted=false;
}tree[N];
bool v[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
char data[15];
int lch,rch;
scanf("%s%d%d",data,&lch,&rch);
node tmp;
strcpy(tmp.data,data);
tmp.lch=lch,tmp.rch=rch;
tree[i]=tmp;
v[lch]=v[rch]=true;
}
for(int i=1;i<=n;++i)
if(!v[i]){
root=i;
break;
}
stack<int>st;
int lastVisit=root;
while(root!=-1||!st.empty()){
if(root!=-1){
st.push(root);
printf("(");
if(tree[root].lch==-1){
printf("%s",tree[root].data);
tree[root].isPrinted=true;
}
root=tree[root].lch;
}else{
root=st.top();
if(tree[root].rch==-1||tree[root].rch==lastVisit){
if(!tree[root].isPrinted) printf("%s",tree[root].data);
printf(")");
st.pop();
lastVisit=root;
root=-1;
}else{
root=tree[root].rch;
}
}
}
return 0;
}