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;
}
posted @ 2022-06-03 10:12  Ryomk  阅读(44)  评论(0编辑  收藏  举报