数据结构实验之二叉树五:层序遍历
Time Limit: 1000MS Memory limit: 65536K
题目描述
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立二叉树并求二叉树的层次遍历序列。
输入
输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据。每行是
一个长度小于50个字符的字符串。
输出
输出二叉树的层次遍历序列。
示例输入
2 abd,,eg,,,cf,,, xnl,,i,,u,,
示例输出
abcdefg xnuli
提示
借助队列来记录各个叶子节点
#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
char a[100];
int i;
BiTree CreatBiTree()
{
BiTree T;
if (a[i++] == ',')
T = NULL;
else
{
T = (BiTree)malloc(sizeof (BiTNode));
if (!T)
return 0;
T->data = a[i-1];
T->lchild = CreatBiTree();
T->rchild = CreatBiTree();
}
return T;
}
void LevelOrder(BiTree T)
{
BiTree p = T;
if (T == NULL)
return;
else
{
queue<BiTree> q;//队列
q.push(p);//根节点入队
while (!q.empty())//队列不为空
{
p = q.front();//对头元素出队;
printf ("%c",p->data);//访问P指向的结点
q.pop();//退出队列
if (p->lchild != NULL)
q.push(p->lchild);//左子树不为空,将左子树入队
if (p->rchild != NULL)
q.push(p->rchild);//右子树不为空,将右子树入队
}//while
}
}
/*void LevelOrder(BiTree T)
{
BiTree q[10000],p = T;
int s = 0,e = 0;
if (p == NULL)
return ;
else
{
q[e++] = p;
while (s!=e)
{
p = q[s++];
printf ("%c",p->data);
if (p->lchild != NULL)
q[e++] = p->lchild;
if (p->rchild != NULL)
q[e++] = p->rchild;
}
}
}*/
int main()
{
int t;
BiTree T;
scanf ("%d",&t);
while (t--)
{
scanf ("%s",a);
i = 0;
T = CreatBiTree();
LevelOrder(T);
printf ("\n");
}
return 0;
}