代码实现求二叉树结点数和叶子结点数(C语言)

简介: 代码实现求二叉树结点数和叶子结点数(C语言)

两种方法求二叉树结点总个数

简单递归调用

核心思想就是递归调用函数,第一种思路就是,定义一个变量,如果树不为空则让此变量+1,然后递归访问左子树和右子树,每一次访问到结点都让此变量+1。就是我们的代码实现过程。

另外,为了使每次我们调用的这个变量都能+1,所以此变量必须是全局变量,定义在函数外面,不然你想想,定义在函数里面,是不是每一次调用都会让其初始化成0或其他当时定义好的数。

下面就是代码实现。

intsize=0;
voidTreeSize(BTNode*root)//求二叉树结点个数{
if (root==NULL)
    {
return;
    }
else    {
++size;
    }
TreeSize(root->left);
TreeSize(root->right);
}

此时main函数是这样写。

intmain()
{
BTNode*A= (BTNode*)malloc(sizeof(BTNode));
A->data='A';
A->left=NULL;
A->right=NULL;
BTNode*B= (BTNode*)malloc(sizeof(BTNode));
B->data='B';
B->left=NULL;
B->right=NULL;
BTNode*C= (BTNode*)malloc(sizeof(BTNode));
C->data='C';
C->left=NULL;
C->right=NULL;
BTNode*D= (BTNode*)malloc(sizeof(BTNode));
D->data='D';
D->left=NULL;
D->right=NULL;
BTNode*E= (BTNode*)malloc(sizeof(BTNode));
E->data='E';
E->left=NULL;
E->right=NULL;
A->left=B;
A->right=C;
B->left=D;
B->right=E;
TreeSize(A);
printf("A TreeSize:%d\n", size);
size=0;
TreeSize(B);
printf("B TreeSize:%d\n", size);
return0;
} 

注意事项:①不要忘记头文件#include<stdio.h>    #include<stdlib.h>

②主函数调用求结点函数一次后,必须执行size = 0;这一步归零操作,不然接下来调用此函数时会出现size累加现象!


分治思想

分治思想就是:比如一个学校要求一下总人数,那么校长可以把几个年级主任叫过来,让他们去统计各年级的人数,然后年级主任回去又把本年级的班主任叫过来,让他们统计各班人数,最后相加,这就是分治思想。

以下是代码实现。

//分治的思想求二叉树结点数intTreeSize(BTNode*root)
{
returnroot==NULL?0 : TreeSize(root->left) +TreeSize(root->right) +1;
}

非常的简单粗暴一行了结。

讲解:先判断树是否为空,即root == NULL?  若为空则返回0,若不为空则返回TreeSize(root->left) + TreeSize(root->right) + 1。这样就会继续递归调用,最后加一就是加的根结点。

此时main函数调用就如下

printf("A TreeSize:%d\n", TreeSize(A));
printf("B TreeSize:%d\n", TreeSize(B));

求叶子结点的个数

叶子结点就是度为0的结点。依然用分治思想。

如果树为空返回0,然后判断此结点是否是叶子结点的方法就是判断左子树右子树是否同时为空。最后递归调用访问其他不是叶子结点的结点。

以下是代码实现。

//求叶子结点的个数intTreeLeafSize(BTNode*root)
{
if (root==NULL)
return0;
if (root->left==NULL&&root->right==NULL)
return1;
returnTreeLeafSize(root->left) +TreeLeafSize(root->right);
}

图片.png

以上面的二叉树为例,从A开始判断是否是叶子结点。不是。执行return语句中TreeLeafSize(root->left) + TreeLeafSize(root->right)。


TreeLeafSize(root->left) 会访问到B结点,B也不是叶子结点,再执行return语句中TreeLeafSize(root->left) + TreeLeafSize(root->right)。  


之后TreeLeafSize(root->left)会访问到D结点,D结点是叶子结点,return 1;


继续执行B结点处TreeLeafSize(root->right),访问到E结点,E结点是叶子结点,return 1;


此时B结点处收到的叶子结点总数为2,上报给A,A的左子树递归完毕,左子树叶子结点也求完了。


按此顺序继续递归即可,最好自己画一个图理解。

目录
相关文章
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
54 4
|
23天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
29天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
24天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
56 1
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
132 8
|
2月前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
2月前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
3月前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
61 4
|
2月前
|
C语言
C语言练习题代码
C语言练习题代码