题意:已知一棵二叉树的带虚结点(#)表示的前序遍历序串
输出:对应二叉树的中序遍历序(不含虚结点)、后序遍历序(不含虚结点)和层次遍历序(不含虚结点)
代码:
#include<cstdio>
#include<cstdlib>
#include<queue>
using namespace std;
typedef struct stu
{
char c;
struct stu *l,*r;
}Tree;
int i;
char c;
queue<Tree *> q;
void creat(Tree **T,int t) //由先序建立二叉树
{
*T=NULL;
if(t)
c=getchar();
t=1;
if(c=='\n'){
*T=NULL;
return ;
}
if(c=='#')
*T=NULL;
else{
*T=(Tree *)malloc(sizeof(Tree));
(*T)->c=c;
creat(&(*T)->l,t);
creat(&(*T)->r,t);
}
}
void My_printz(Tree *T) //中序输出
{
if(T!=NULL){
My_printz(T->l);
printf("%c",T->c);
My_printz(T->r);
}
}
void My_printh(Tree *T) //后序输出
{
if(T!=NULL){
My_printh(T->l);
My_printh(T->r);
printf("%c",T->c);
}
}
void ccbl(Tree *T) //层次遍历输出
{
q.push(T);
while(!q.empty()){
T=q.front();
q.pop();
printf("%c",T->c);
if(T->l!=NULL)
q.push(T->l);
if(T->r!=NULL)
q.push(T->r);
}
}
int main()
{
Tree *T;
while((c=getchar())!=EOF){
creat(&T,0);
if(T==NULL) //空树
printf("\n");
else{
My_printz(T);
printf(" ");
My_printh(T);
printf(" ");
if(!q.empty())
q.pop();
ccbl(T);
printf("\n");
}
getchar();
}
return 0;
}