6-2 统计二叉树结点个数(C语言解法)(PTA)

题目描述

本题要求实现一个函数,可统计二叉树的结点个数。

函数接口定义:

int NodeCount ( BiTree T);
T是二叉树树根指针,函数NodeCount返回二叉树中结点个数,若树为空,返回0。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree Create();/* 细节在此不表 */

int NodeCount ( BiTree T);

int main()
{
    BiTree T = Create();
    
    printf("%d\n", NodeCount(T));
    return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
输入为由字母和'#'组成的字符串,代表二叉树的扩展先序序列。例如对于如下二叉树,输入数据:

AB#DF##G##C##

解题思路

C语言解法

int NodeCount(BiTree T) {  
    if (T == NULL) {  
        return 0; // 如果节点为空,则直接返回0,因为没有节点需要计数  
    }  
      
    // 当前节点不为空,先计数当前节点,然后递归计算左右子树的节点数  
    return 1 + NodeCount(T->lchild) + NodeCount(T->rchild);  
}

对于第一段代码,递归的逻辑是这样的:

  • 从根节点开始,函数会先检查根节点是否为空。
  • 如果不为空,则先计数根节点(即加1),然后递归地对左子树和右子树进行相同的操作。
  • 递归会一直进行到遇到空节点(即叶子节点的下一个空位置),此时返回0,并逐层向上返回,累加每个子树的节点数,最终得到整棵树的节点总数。

如果实在不理解,可以参考以下这段代码,复杂了一些不过更好理解

int NodeCount ( BiTree T)
{
    // 通过递归来完成统计二叉树节点个数
    int cnt=0; // 对于每个根节点(递归中形参的不同导致对应的根节点不同)
    if(T!=NULL)
    {
        cnt++; // 如果树根指针不为空 代表此时从这个根节点开始 计数器先+1统计根节点
        
        // 对于每个根节点的左右子树 递归求对每个不同的根节点来说的节点个数
        cnt+=NodeCount(T->lchild);
        cnt+=NodeCount(T->rchild);
    }
    // 递归出口 也可以显式地表示为if(T==NULL)
    return cnt;
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值