
/* 编程求以孩子兄弟表示法存储的森林的叶子结点数 分析: 我们可以试想一个节点它如果有左孩子,那么根据孩子兄弟表示法的规则,那它一定不是叶节点,相反如果没有左孩子,那么 它一定是叶子结点,其右孩子即它的兄弟,同样应该这样去判断。*/typedef struct node { char data; node *fch, *nsib;}Tree;#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>Tree *create(Tree *T) {//先序创建一颗二叉树 char data; printf("请输入当前节点值:data="); scanf("%c", &data); getchar(); if (data != '#') { T = (Tree *)malloc(sizeof(Tree)); T->data = data; T->fch = NULL; T->nsib = NULL; T->fch = create(T->fch); T->nsib = create(T->nsib); } return T;}int frostLeaf(Tree *T) { if (!T) {//空则返回0,也是递归的出口 return 0; } else { if (!T->fch) {//没有左孩子,该节点为叶子结点 return 1 + frostLeaf(T->nsib); } else {//有左孩子,该节点不是叶子结点 return frostLeaf(T->fch) + frostLeaf(T->nsib); } }}int main() { Tree *T = (Tree *)malloc(sizeof(Tree *)); T = create(T); printf("该森林的叶子结点个数为:%d", frostLeaf(T)); return 0;}