数据结构实验之二叉树三:统计叶子数
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点)。请建立二叉树并求二叉树的叶子结点个数。
Input
连续输入多组数据,每组数据输入一个长度小于50个字符的字符串。
Output
输出二叉树的叶子结点个数。
Sample Input
abc,,de,g,,f,,,
Sample Output
3
Hint
Source
xam
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char data;
struct node *L_child, *R_child;
};
struct node * Creat_Tree();
void Getnum(struct node *);
char str[100];
int t, count;///t用于建立二叉树,count用于记录叶子数
int main()
{
while(~scanf("%s", str))
{
t = count = 0;///t 和 count设置为全局量的时候记得每次清零
struct node *Root;
Root = Creat_Tree();
Getnum(Root);///计算叶子数
printf("%d\n", count);
}
return 0;
}
struct node * Creat_Tree()
{
struct node *Root;
char ch = str[t++];///每次用完 t 需要 +1
if(ch == ',') Root = NULL;
else
{
Root = (struct node *)malloc(sizeof(struct node));
Root->data = ch;
Root->L_child = Creat_Tree();
Root->R_child = Creat_Tree();
}
return Root;///返回树的根节点地址
}
void Getnum(struct node *Root)
{
if(Root != NULL)
{
if(Root->L_child == NULL && Root->R_child == NULL)
{///如果该结点没有左右孩子,那么该结点为叶子
count++;
}
else
{
Getnum(Root->L_child);
Getnum(Root->R_child);
}
}
}