数据结构实验之二叉树五:层序遍历
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
Hint
Source
xam
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int l ;
char s[51];
struct node //树节点的创立
{
char data;
struct node *left , *right;
};
struct node *creat() //(有返回值的建立二叉树)
{
char c = s[l++];
struct node *root;
if (c == ',')
{
return NULL;
}
else
{
root = (struct node *)malloc(sizeof (struct node ));
root ->data = c;
root ->left = creat();
root ->right = creat();
}
return root;
};
void midd(struct node *root) //中序遍历
{
if (root)
{
midd(root ->left);
printf("%c" , root->data);
midd(root ->right);
}
}
void hou(struct node *root) // 后序遍历
{
if (root)
{
hou(root ->left);
hou(root ->right);
printf("%c" , root ->data);
}
}
int leave(struct node *root) // 叶子结点的查找(叶子结点即为出度为0的节点)
{
if (root == NULL)
{
return 0;
}
else if (root ->left == NULL && root ->right == NULL)
{
return 1;
}
else
{
return leave(root ->left) + leave(root ->right);
}
}
int deth(struct node *root) // 树的高度
{
if (root == NULL)
{
return 0;
}
else
{
int maxleft = deth(root ->left) , maxright = deth(root ->right);
if (maxleft > maxright)
{
return 1 + maxleft;
}
else
{
return 1 + maxright;
}
}
}
int main()
{
struct node *root;
while(~scanf("%s" , s))
{
l = 0;
root = (struct node *)malloc(sizeof (struct node ));
root = creat();
midd(root);
printf("\n");
hou(root);
printf("\n");
int k ;
k = leave(root);
printf("%d\n" , k);
k = deth(root);
printf("%d\n", k);
}
return 0;
}