题目描述
用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树,请编程构造二叉树并按照要求输出
输入格式
每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过1000。每个结点为一个小写字母或一个数字(大于等于0,小于等于9)。
输出格式
对每行输入,按照前序输出对应二叉树。每个节点单独占一行,根节点为第0层,每i层多输出2*i个空格后再输出节点。如果一个节点只有一个子节点,则另一个空的子节点需要输出#
如果是一个空的二叉树,直接输出空行。
输入样例 复制
ab##c##
#
ab###
输出样例 复制
a
b
c
a
b
#
分类标签
#include<iostream>
using namespace std;
struct BiNode
{
char data;
BiNode *lchild,*rchild;
};
typedef BiNode *BiTree;
char *CreateBiTree(BiTree &T,char *s)
{
if(*s=='#')
{
T=NULL;
return s+1;
}
T=new BiNode;
T->data=*s;
char *strAfterLeft = CreateBiTree(T->lchild, s + 1);
char *strAfterRight = CreateBiTree(T->rchild,strAfterLeft);
return strAfterRight;
}
void PreTraverse(BiTree &T,int level)
{
if(!T) return;
for(int i=0;i<level;i++)
{cout<<" ";}
cout<<T->data<<endl;
if(!T->lchild&&T->rchild)
{
for(int i=0;i<level+1;i++)
{cout<<" ";}
cout<<"#"<<endl;
}
PreTraverse(T->lchild,level+1);
if(T->lchild&&!T->rchild)
{
for(int i=0;i<level+1;i++)
{cout<<" ";}
cout<<"#"<<endl;
}
PreTraverse(T->rchild,level+1);
}
int main()
{
char s[2000];
while(cin>>s)
{
BiTree T=NULL;
CreateBiTree(T,s);
if(T==NULL) cout<<endl;
PreTraverse(T,0);
}
return 0;
}