UVA11234 - Expressions
这个又是放了好久才做的题,最近刚学到二叉树,对遍历熟悉了以后,发现给出的第一的入栈序列正着读的话不是正经的后序遍历,
但是,如果反过来去读的话,你会发现这是一个标准的先序遍历,(不知有多少人发现了这个规律)
故,我是反序读入建树的,这样就省了调用栈,也省不少用时。
这个问题,解决了以后,bfs是我最大的障碍,自学了bfs以后我才把这道题A掉的。
代码如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; struct node{ char data; node *lnode, *rnode; }; int length; char s[10010]; node* queue[10010]; void input(char ch,node *&L) { L = (node*)malloc(sizeof(node)); L->data = ch; if(ch>='a'&&ch<='z') { L->lnode = L->rnode = NULL; return; } else { input(s[--length],L->lnode); input(s[--length],L->rnode); } } void bfs(node *l) { int front = 0, rear = 1, count = 0; queue[front] = l; while(front<rear) { if(queue[front]->rnode)queue[rear++] = queue[front]->rnode; if(queue[front]->lnode)queue[rear++] = queue[front]->lnode; s[count++] = queue[front++]->data; } for(int i=count-1; i>=0; i--) cout<<s[i]; cout<<endl; } int main () { int t; node *l; cin>>t;cin.ignore(); while(t--) { gets(s);//cout<<s<<endl; for(length = 0;s[length];length++); input(s[--length],l); bfs(l); } return 0; }