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; }
本文作者:Ryomk
本文链接:https://www.cnblogs.com/preccrep/p/16339621.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步