题目:题目详情 - 7-6 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (20 分) (pintia.cn)
题解:
1.这个题目涉及知识点二叉树的建立,二叉树的遍历输出(很简单,不做介绍),叶子结点个数的确定。
2.二叉树的建立:结构体一个数据域,两个指针域。一个左儿子,一个右儿子。关于树的建立我用的一个结构体指针函数,返回值为本次这个结构体指针的值。确定完根的值,再确定左儿子的值,然后再是右儿子的值。
3.叶子结点个数的确定:叶子结点就是左右儿子的值为NULL的结点,处理叶子结点,找到左右儿子并判断它们的值为NULL,结点数加1。
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
char data;
struct node *left;
struct node *right;
}btree,*tree;
tree creat()
{
char s;
tree t;
scanf("%c",&s);
if(s=='#')
{
return NULL;
}
else
{
t=(struct node*)malloc(sizeof(struct node));
t->data=s;
t->left=creat();
t->right=creat();
return t;
}
}
void pri(tree t)
{
if(t==NULL)
return;
else
{
printf("%c",t->data);
pri(t->left);
pri(t->right);
}
}
void pri1(tree t)
{
if(t==NULL)
return;
else
{
pri1(t->left);
printf("%c",t->data);
pri1(t->right);
}
}
void pri2(tree t)
{
if(t==NULL)
return;
else
{
pri2(t->left);
pri2(t->right);
printf("%c",t->data);
}
}
int ans;
void djian(tree t)
{
if(t==NULL)
return 0;
if(t!=NULL)
{
djian(t->left);
djian(t->right);
if(t->left==NULL&&t->right==NULL)
ans++;
}
}
int main()
{
tree root;
root=creat();
if(root==NULL)
printf("0");
else
{
pri(root);
printf("\n");
pri1(root);
printf("\n");
pri2(root);
printf("\n");
djian(root);
printf("%d",ans);
}
return 0;
}