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<string.h>
#include<stdlib.h>
//构建树的基本存储结构
typedef struct node
{
char ch ;
struct node *left ;
struct node *right ;
}Tree ;
int cmd ; //记录叶子个数
char str[100] ; //记录读入数据
int top ; //记录当前树中
Tree *build()
{
Tree *root ;
root = (Tree*)malloc(sizeof(Tree)) ;
if(str[top] == ',')
root =NULL ;
else root->ch = str[top] ;
top ++ ;
if(root == NULL )
return NULL ;
else
{
root->left = build() ;
root->right = build() ;
}
return root ;
}
void find(Tree *root)
{
if(root)
{
if(root->left == NULL && root->right == NULL)
{
cmd++ ;
}
find(root->left) ;
find(root->right) ;
}
}
int main()
{
while(~scanf("%s",str))
{
Tree *root ;
cmd = 0 ;
top = 0 ;
root = build() ;//构建树
find(root) ; //寻找叶子
printf("%d\n",cmd) ;
}
return 0 ;
}
代码2:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
char ch ;
struct node *left ;
struct node *right ;
}Tree;
char a[55] ;
int cmd ;
int count ;
Tree *creat()
{
if(a[cmd++] == ',')
return NULL ;
else
{
Tree *root = (Tree*)malloc(sizeof(Tree)) ;
root ->ch = a[cmd-1] ;
root->left = creat() ;
root->right =creat() ;
return root ;
}
}
int leave(Tree *root)
{
if(root == NULL )
return 0 ;
if(root->left == NULL && root->right == NULL )
return 1 ;
else {
int d = leave(root->left) ;
int r = leave(root->right) ;
return d+r ;
}
}
void z(Tree *root )
{
if(root )
{
z(root->left) ;
if(root->left == NULL && root->right == NULL)
count++ ;
z(root->right) ;
}
}
int main()
{
Tree *root ;
while(~scanf("%s",a)){
cmd = 0 ;
count = 0 ;
root = creat() ;
z(root) ;
printf("%d\n",count) ;
}
return 0 ;
}