题目描述
用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树。
输入格式
每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过2000。每个结点为一个小写字母或一个数字。
输出格式
对每行输入,输出对应二叉树的中序遍历序(不含虚结点)、后序遍历序(不含虚结点)和层次遍历序(不含虚结点)。 每棵二叉树的输出占一行,中序遍历序、后序遍历序和层次遍历序之间用一个空格隔开。
输入样例
ab##c##
#
ab###
输出样例
bac bca abc
ba ba ab
数据范围与提示
Sample Input的第二行表示一棵空树,因此输出时输出两个空格。
代码展示
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
struct BiNode{
string data;
BiNode *lchild,*rchild;
};
using BiTree=BiNode*;
//根据前序遍历串创建二叉树
char *CreateBiTree(BiTree &T,char *str){
if(*str=='#'){
T=nullptr;
return str+1;
}
T=new BiNode;
T->data=*str;
char * strAfterLeft=CreateBiTree(T->lchild,str+1);
char * strAfterRight=CreateBiTree(T->rchild,strAfterLeft);
return strAfterRight;
}
int PreTraverse(BiTree T){//前序遍历(此题用不到)
if(T==nullptr) return 0;
cout<<T->data<<endl;
PreTraverse(T->lchild);
PreTraverse(T->rchild);
return 0;
}
int InTraverse(BiTree T){//中序遍历
if(T==nullptr) return 0;
InTraverse(T->lchild);
cout<<T->data;
InTraverse(T->rchild);
return 0;
}
int SucTraverse(BiTree T){//后序遍历
if(T==nullptr) return 0;
SucTraverse(T->lchild);
SucTraverse(T->rchild);
cout<<T->data;
return 0;
}
void LevelOrder(BiTree T){//层次遍历,队列实现
if(T==nullptr) return;//空树
queue<BiNode *>nodeQueue;
nodeQueue.push(T);//根节点入队
while(!nodeQueue.empty()){//队非空时进行访问
BiNode *node=nodeQueue.front();//取头结点
cout<<node->data;//访问结点数据
if(node->lchild) nodeQueue.push(node->lchild);//左子结点入队
if(node->rchild) nodeQueue.push(node->rchild);//右子结点入队
nodeQueue.pop();//头结点出队
}
}
int DestroyBiTree(BiTree &T){//销毁二叉树
if(T==nullptr) return 0;
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
delete T;
T=nullptr;
return 0;
}
int main(){
//freopen("/config/workspace/test/test","r",stdin);
string s;
while(cin>>s){
BiTree tree=nullptr;
CreateBiTree(tree,&s[0]);
InTraverse(tree);
cout<<" ";
SucTraverse(tree);
cout<<" ";
LevelOrder(tree);
cout<<endl;
DestroyBiTree(tree);
}
return 0;
}