题目描述
求一颗树的后序遍历的非递归算法
要求:必须是非递归算法,使用堆栈对象来实现
建树方法采用“先序遍历+空树用0表示”的方法
算法流程:
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行
输出
逐行输出每个二叉树的后序遍历结果
样例输入
3
AB0C00D00
ABC00D00EF000
ABCD0000E0F00
样例输出
CBDA
CDBFEA
DCBFEA
代码
#include "bits/stdc++.h"
using namespace std;
struct NODE{
char data;
NODE *l,*r;
NODE(){
l=NULL;
r=NULL;
}
};
int t,n,id;
string s;
void build(NODE *&head){
if(id>=n || s[id]=='0'){
head=NULL;
id++;
return;
}
head=new NODE;
head->data=s[id];
id++;
build(head->l);
build(head->r);
}
void posorder(NODE *head){
// if(head==NULL) return;
stack<NODE*> s1;
stack<int> s2;
NODE* p=head;
do{
while(p){
s1.push(p);
s2.push(0);
p=p->l;
if(s1.empty())
break;
}
while(!p){
int tag=s2.top();
if(tag==0){
s2.pop();
s2.push(1);
p=s1.top()->r;
}
else{
p=s1.top();
s1.pop();
s2.pop();
cout<<p->data;
p=NULL;
}
if(s2.empty())
break;
}
}while(!s1.empty());
cout<<endl;
}
int main(){
// freopen("123.in","r",stdin);
cin>>t;
while(t--){
id=0;
cin>>s;
n=s.length();
NODE *head;
build(head);
posorder(head);
}
return 0;
}