本篇会用到之前讲过的二叉树三种遍历方法的代码实现,当然这里还会再写一遍,可以先去看这篇博客二叉树的概念及三种遍历方法(C语言)_Perfectkn的博客-CSDN博客

目录

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

简单递归调用

分治思想

求叶子结点的个数


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

简单递归调用

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

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

下面就是代码实现。

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

此时main函数是这样写。

int main()
{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);return 0;
} 

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

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


分治思想

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

以下是代码实现。

//分治的思想求二叉树结点数
int TreeSize(BTNode* root)
{return root == 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,然后判断此结点是否是叶子结点的方法就是判断左子树右子树是否同时为空。最后递归调用访问其他不是叶子结点的结点。

以下是代码实现。

//求叶子结点的个数
int TreeLeafSize(BTNode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

以上面的二叉树为例,从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的左子树递归完毕,左子树叶子结点也求完了。

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

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

  1. 树:求二叉树的高度和叶子结点数量

    算法代码很简单都是用使用递归计算,大家把递归思想领悟到就ok了. 二叉树高度算法 //求二叉树的高度 采用递归的方式 void GetHeight(BiTree tree, int* heightNu ...

  2. 求二叉树中结点个数代码java_求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

  3. 计算二叉树的深度和叶子结点数(递归算法实现)

    [问题描述] 计算二叉树的深度和叶子结点数 [输入形式] 输入二叉树的先序遍历序列建立二叉树. [输出形式] 输出二叉树的叶子结点数和深度. [样例输入] A B C # # # # [样例输出] L ...

  4. 求二叉树b的结点个数、叶子结点个数

    #include"tree.cpp" //包含了二叉树的基本算法/*-------- 求二叉树b的结点个数.叶子结点个数 ---------*///求二叉树b的结点个数 int N ...

  5. 叶子结点和分支节点_结点数和叶子结点数有什么区别

    展开全部 结点数和叶子结点数的区别: 叶子结点是度为0的结点,简单的说就是一个二叉树任意一个分支上62616964757a686964616fe58685e5aeb931333365653931的终端 ...

  6. java 树最大距离_寻找二叉树最远的叶子结点(实例讲解)

    面试的时候碰到一个题:如何找到一个二叉树最远的叶子结点,以及这个叶子结点到根节点的距离? 第一反应肯定是递归 如何能找到最远的叶子结点,同时也能记下这个叶子节点到根节点的距离呢?采用一个List保持从 ...

  7. 设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m0)个叶子结点,那么该二叉树上的结点总数为( )。

    设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树.假如一棵这样的二叉树中有m(m>0)个叶子结点,那么该二叉树上的结点总数为( ). 正确答案: B   你的答案: B (正确) ...

  8. 二叉树探究之非叶子结点和叶子结点对半分且最多差一个

    分析第一步,二叉树根据完整性(即最后一层是否满了)可分为"完整二叉树"和"非完整二叉树"(不知道有没有这个概念,自己定义的),然后从特殊情况开始即"完 ...

  9. Java实现判断叶子节点_寻找二叉树最远的叶子结点(实例讲解)

    二叉树最远的叶子实例分享 面试的时候碰到一个题:如何找到一个二叉树最远的叶子结点,以及这个叶子结点到根节点的距离? 第一反应肯定是递归 如何能找到最远的叶子结点,同时也能记下这个叶子节点到根节点的距离 ...

最新文章

  1. BCE支持者在BCH见面会烧毁BCH主题衣服
  2. 事务里面捕获异常_三问Spring事务:解决什么问题?如何解决?存在什么问题?...
  3. Error - Found cycle in the ListNode
  4. 法学界四大主流“数据权利与权属”观点
  5. 远程桌面命令是什么 如何使用命令连接远程桌面
  6. 有效查看笔记本的cpu类型、内存品牌、硬盘颗粒类型
  7. 隐私计算--21--分布式机器学习
  8. 高等数学—常见三角函数
  9. mysql设置59分59秒会自动加一秒
  10. 360全景倒车影像怎么看_360度全景倒车影像真的很有用?水分有多少!
  11. 目标决定人生——没有目标就失去一切 (转载)
  12. 自定义ckeditor图片上传插件
  13. JavaScript-switch条件分支语句
  14. #457 科技乱炖:去中心化的Damus,会比Twitter更好么
  15. ROS简介(新手入门须知)
  16. 智慧城市专题视频课程 附教案
  17. css设置overflow:hiden行内元素会发生偏移的现象
  18. 云服务器到底是什么?云服务器的优势有哪些
  19. 设置 app 不能在模拟器上运行
  20. Python实现图像直方图规定化(直方图匹配)-附完整代码

热门文章

  1. java-Native.toString(xxx)乱码
  2. 2023年Q1电商平台饮料行业数据分析报告
  3. 高智商男性对伴侣更忠诚
  4. 人工智能Java SDK:大数据与AI技术相结合 - kafka-人脸检测
  5. 企业10大管理流程图,数字化转型从业者必备!
  6. 关于C++,Java与Python取余的不同
  7. 牛客网数据库SQL实战54——查找排除当前最大、最小salary之后的员工的平均工资avg_salary
  8. 厦门2017计算机考试题目,2017年厦门市小学生计算机LOGO语言竞赛(初赛)试卷
  9. vue动画、vue位移动画、vue列表动画
  10. HTTP接口交互开发之okhttp