题目描述
本题要求实现一个函数,可统计二叉树的结点个数。
函数接口定义:
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;
}