89.png

    1. /*
    2. 编程求以孩子兄弟表示法存储的森林的叶子结点数
    3. 分析:
    4. 我们可以试想一个节点它如果有左孩子,那么根据孩子兄弟表示法的规则,那它一定不是叶节点,相反如果没有左孩子,那么
    5. 它一定是叶子结点,其右孩子即它的兄弟,同样应该这样去判断。
    6. */
    7. typedef struct node {
    8. char data;
    9. node *fch, *nsib;
    10. }Tree;
    11. #define _CRT_SECURE_NO_WARNINGS
    12. #include <stdio.h>
    13. #include <stdlib.h>
    14. Tree *create(Tree *T) {//先序创建一颗二叉树
    15. char data;
    16. printf("请输入当前节点值:data=");
    17. scanf("%c", &data);
    18. getchar();
    19. if (data != '#') {
    20. T = (Tree *)malloc(sizeof(Tree));
    21. T->data = data;
    22. T->fch = NULL;
    23. T->nsib = NULL;
    24. T->fch = create(T->fch);
    25. T->nsib = create(T->nsib);
    26. }
    27. return T;
    28. }
    29. int frostLeaf(Tree *T) {
    30. if (!T) {//空则返回0,也是递归的出口
    31. return 0;
    32. }
    33. else {
    34. if (!T->fch) {//没有左孩子,该节点为叶子结点
    35. return 1 + frostLeaf(T->nsib);
    36. }
    37. else {//有左孩子,该节点不是叶子结点
    38. return frostLeaf(T->fch) + frostLeaf(T->nsib);
    39. }
    40. }
    41. }
    42. int main() {
    43. Tree *T = (Tree *)malloc(sizeof(Tree *));
    44. T = create(T);
    45. printf("该森林的叶子结点个数为:%d", frostLeaf(T));
    46. return 0;
    47. }