首先分析一下题意,通过一个类似于广义表的数据输入串来构建树,很明显是要通过递归定义来构建,讲真开始我也没思路(懵)偷一下某大佬的图
如果每次读入两个数据,那么就基本可以区分是根还是叶,如果出现了图中最下方两种情况,那就再读取一个,一定能判断出到底是叶子还是根节点
思路分析:
1.每次读入两个字符,如果是第一个字符是‘,’就要再读第三个,如果第三个为‘)’那么就停止,如果第三个是‘(’就再递归创建左子树右子树
2.如果第一个为字符,那么就直接把字符输入这个节点,如果第二个字符为‘(’,也依次递归创建左子树右子树。
3.自信分析,理性分析,胡乱分析,还行.......
就酱,代码(づ ̄3 ̄)づ╭❤~
#include <stdio.h>
#include <stdlib.h>
struct BinTree
{//定义二叉链表储存二叉树
char data;
struct BinTree *left;
struct BinTree *right;
};
struct BinTree *creat()
{ //输入一串特殊形式的字符串创建二叉链表
char s;
struct BinTree*cur;
s=getchar (); //gerchar
if (s>='A'&&s<='Z') //如果是字母就创建一个节点
{
cur=(struct BinTree*)malloc(sizeof(struct BinTree));
cur->data=s; //这个节点的数据就是s
cur->left=creat(); //依此递归创建二叉树的左子树和右子树
cur->right=creat();
return cur;
}
else
{
return NULL; //在碰到特殊符号的时候返回这一支为NULL
}
}
int GetLeaf(struct BinTree *T)
{
int nLeft=0,nRight=0;
if (T->left==NULL&&T->right==NULL)
return 1; //如果没有左子树没有右子树就是叶子 返回1个叶子
if (T->left)
nLeft=GetLeaf(T->left); //有左边就递归计算左子树的叶子数
if (T->right)
nRight=GetLeaf(T->right); //右子树同理递归
return nLeft+nRight; //最后返回左子树右子树的叶子数加和
}
int main()
{
int n;
struct BinTree *T;
T=creat();
n=GetLeaf(T);
printf ("%d",n); //输出叶子数
return 0;
}