这一题参考了http://blog.sina.com.cn/s/blog_6955a88501014nh5.html这里的代码
描述
链式二叉树的创建及遍历
树的遍历有先序遍历、中序遍历和后序遍历。先序遍历的操作定义是先访问根结点,然后访问左子树,最后访问右子树。中序遍历的操作定义是先访问左子树,然后访问根,最后访问右子树。后序遍历的操作定义是先访问左子树,然后访问右子树,最后访问根。对于采用链式存储结构的二叉树操作中,创建二叉树通常采用先序次序方式输入二叉树中的结点的值,空格表示空树。对于如下的二叉树,我们可以通过如下输入“AE-F--H--”得到( ‘-’表示空子树)。
试根据输入创建对应的链式二叉树,并输入其先序、中序和后序遍历结果。
输入
输入第一行为一个自然数n,表示用例个数
接下来为n行字符串,每行用先序方式输入的要求创建的二叉树结点,’-’表示前一结点的子树为空子树。
输出
对每个测试用例,分别用三行依次输出其先序、中序和后序遍历结果。
样例输入
1
abdh---e-i--cf-j--gk---
abdh---e-i--cf-j--gk---
样例输出
abdheicfjgk
hdbeiafjckg
hdiebjfkgca
hdbeiafjckg
hdiebjfkgca
#include <iostream>
using namespace std;
char a;
typedef char Elemtype;
typedef struct Bitree
{
Elemtype data;
struct Bitree*lchild, *rchild;
}Bitree;
Bitree *GreatBitree(Bitree *t)//这个地方看不懂啊,为什么要在前面在*
{//此函数为根据输入创建二叉树,注意输入应按先序遍历顺序
cin>>a;
if(a=='-')
t=NULL;
else
{
t = new Bitree;
t->data = a;
t->lchild=GreatBitree(t->lchild);
t->rchild=GreatBitree(t->rchild);
}
return t;
}
void Firstorder(Bitree *t)//先序遍历输出
{
if(t)
{
cout<<t->data;
Firstorder(t->lchild);
Firstorder(t->rchild);
}
}
void Midorder(Bitree *t)//中序遍历输出
{
if(t)
{
Midorder(t->lchild);
cout<<t->data;
Midorder(t->rchild);
}
}
void Lastorder(Bitree *t)//后序遍历输出
{
if(t)
{
Lastorder(t->lchild);
Lastorder(t->rchild);
cout<<t->data;
}
}
int main()
{
int nl;
cin>>nl;
while(nl--)
{
Bitree *t;
t = new Bitree;
getchar();
t=GreatBitree(t);
Firstorder(t);cout<<endl;
Midorder(t);cout<<endl;
Lastorder(t);cout<<endl;
}
return 0;
}