Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点)。请建立二叉树并求二叉树的层次遍历序列。
Input
输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据。每行是一个长度小于50个字符的字符串。
Output
输出二叉树的层次遍历序列。
Sample Input
2
abd,,eg,,,cf,,,
xnl,,i,,u,,
Sample Output
abcdefg
xnuli
层序遍历 有好几种方法,以后接触到我会更新。现在说一下这个代码里的思路,他是通过运用队的思路来实现的
例如 图中 这颗树,首先读取a,输出a,然后把它的左右子树输入,cd,此时输出c,把c的左右子树输入,此时堆栈内容为 d e g,然后输出d,同时将d的左右子树输出,这时队中为e g b n,就这样,输出了acdegbn。
void cengxu(struct TreeNode *root)
{
struct TreeNode *temp[55];
int in = 0,out = 0;
temp[in++] = root;
while(in > out)
{
if(temp[out])
{
printf("%c",temp[out]->Data);
temp[in++] = temp[out]->Left;
temp[in++] = temp[out]->Right;
}
out++;
}
}
这就是层序遍历的部分,需要深层次了解一下
temp会储存每一层的数据,用线性的方式将二叉树层次遍历成了数组的形式。
#include
#include
#include
typedef struct TreeNode *BinTree;
typedef char ElementType;
typedef BinTree Position;
struct TreeNode
{
ElementType Data;
BinTree Left;
BinTree Right;
} ;
char st[55];
int cnt;
struct TreeNode *creat()
{
struct TreeNode *root;
if(st[++cnt] == ',')
{
root = NULL;
}
else
{
root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
root->Data = st[cnt];
root->Left = creat();
root->Right = creat();
}
return root;
};
void cengxu(struct TreeNode *root)
{
struct TreeNode *temp[55];
int in = 0,out = 0;
temp[in++] = root;
while(in > out)
{
if(temp[out])
{
printf("%c",temp[out]->Data);
temp[in++] = temp[out]->Left;
temp[in++] = temp[out]->Right;
}
out++;
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",st);
cnt = -1;
struct TreeNode *root;
root = creat();
cengxu(root);
printf("\n");
}
return 0;
}