【数据结构】计算节点个数和二叉树高度(C语言版)

数据结构——计算节点个数、二叉树高度
  • 一、计算各种节点
    • (1)计算总节点:
    • (2)计算单分支节点:
    • (3)计算双分支节点:
  • 二、计算二叉树高度
    • 代码实现:

一、计算各种节点

二叉树结构体如下:

//	二叉树结构体 
typedef struct TreeLink{
	int Data;
	struct TreeLink *LChild;
	struct TreeLink *RChild;
}T_LINK,*TLINK;	

(1)计算总节点:

让根节点指针开始,进行二叉树的遍历,遍历树节点中不为NULL下,及存在节点,遍历次数相加之和 + 根节点 及为总节点

//	计算二叉树总节点
int Calc_AllJieDian(TLINK p)
{
	if(p == NULL)	//	二叉树为空树 或者 该节点下没有子树
	{
		return 0;
	}
	
	return 1+Calc_AllJieDian(p->LChild)+Calc_AllJieDian(p->RChild); //	遍历该节点的左右子树,再加上根节点 
} 

(2)计算单分支节点:

遍历二叉树途中,只记录遍历树节点中遇到(左边子树存在,右边子树为NULL )或者 (右边子树存在,左边子树为NULL)这种节点,才让递归 返回值 +1,依次累加

//	计算单分支节点 
int Signal_Node(TLINK p)
{
	if(p==NULL){
		
		return 0;
						//	当前节点左右子树其中一个为NULL,单支点数+1 
	}else if((p->LChild==NULL&&p->RChild!=NULL)||(p->LChild!=NULL&&p->RChild==NULL)){
		
		
		return Signal_Node(p->LChild)+Signal_Node(p->RChild)+1;
	
	}else{
		//	双分支都存在,继续向下遍历 
		return Signal_Node(p->LChild)+Signal_Node(p->RChild);
	}
} 

(3)计算双分支节点:

计算双分支节点思路 和 计算单支点相反 为: 遍历 二叉树 只记录 节点指针指向的节点中 左右子树都存在 的时候,递归返回值+1,累加最后返回 就是双分支节点的个数

//	计算双分支节点
int Calc_DoubleNode(TLINK p)
{	
	if(p==NULL){
	
		return 0;
	
	}else if(p->LChild!=NULL&&p->RChild!=NULL){	//	当节点左右子树都存在时,双分支数+1
		 
		return Calc_DoubleNode(p->LChild)+Calc_DoubleNode(p->RChild)+1;	//	继续遍历左右子树 
	
	}else{	//	否则只继续向下遍历左右子树 
	
		return Calc_DoubleNode(p->LChild)+Calc_DoubleNode(p->RChild);
	
	}			
} 

总代码:

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

//	二叉树结构体 
typedef struct TreeLink{
	int Data;
	struct TreeLink *LChild;
	struct TreeLink *RChild;
}T_LINK,*TLINK;	

//	创建二叉树 
TLINK Create_TreeLink()
{
	TLINK T;
	
	int data;
	int temp;
	 
	scanf("%d",&data);
	temp = getchar();	//	吸收scanf带来的回车 

	if(data == -1){		//	输入-1表示该节点下左树或者右树下不存数据,返回到上一级节点 
		
		return NULL;		
	
	}else{
		
		T = (TLINK)malloc(sizeof(T_LINK));	//	每个节点开辟空间 
	
		T->Data = data;
		
		printf("请输入%d节点下左节点数据:  ",data);
		T->LChild = Create_TreeLink();
		
		printf("请输入%d节点下右节点数据:  ",data);
		T->RChild = Create_TreeLink();
		
		return T;
	}	
}

//	计算二叉树总节点
int Calc_AllJieDian(TLINK p)
{
	if(p == NULL)
	{
		return 0;
	}
	
	return 1+Calc_AllJieDian(p->LChild)+Calc_AllJieDian(p->RChild); //	遍历该节点的左右子树,再加上根节点 
} 

//	计算双分支节点
int Calc_DoubleNode(TLINK p)
{	
	if(p==NULL){
	
		return 0;
	
	}else if(p->LChild!=NULL&&p->RChild!=NULL){	//	当节点左右子树都存在时,双分支数+1
		 
		return Calc_DoubleNode(p->LChild)+Calc_DoubleNode(p->RChild)+1;	//	继续遍历左右子树 
	
	}else{	//	否则只继续向下遍历左右子树 
	
		return Calc_DoubleNode(p->LChild)+Calc_DoubleNode(p->RChild);	
	}			
} 

//	计算单分支节点 
int Signal_Node(TLINK p)
{
	
	if(p==NULL){
		
		return 0;
						//	当前节点左右子树其中一个为NULL,单支点数+1 
	}else if((p->LChild==NULL&&p->RChild!=NULL)||(p->LChild!=NULL&&p->RChild==NULL)){
		
		
		return Signal_Node(p->LChild)+Signal_Node(p->RChild)+1;
	
	}else{
		//	双分支都存在,继续向下遍历 
		return Signal_Node(p->LChild)+Signal_Node(p->RChild);
	}
} 

int main()
{
	
	TLINK T;				//	创建二叉树指针 
	printf("输入第一个节点:\n");
	T = Create_TreeLink();
	
	int count = Calc_AllJieDian(T);
	
	int SignalNode = Signal_Node(T); 
	
	int DoubleNode = Calc_DoubleNode(T);
				
	printf("总节点个数为: %d\n",count); 
	printf("叶子节点个数为: %d\n",count-1);
	printf("单支节点个数为: %d\n",SignalNode);
	printf("双支节点个数为: %d\n",DoubleNode); 
}

运行结果:
在这里插入图片描述

二、计算二叉树高度

思路 :

递归遍历二叉树,除去根节点下,比较节点左右子树的遍历次数大小,最后大的结果 加上 根节点 1 ,就是二叉树的高度

代码实现:

//	计算二叉树的高度
int Calc_Hight(TLINK p)
{
	int left ;			//	计算左子树 节点 
	int right; 			//	计算右子树节点
	int Max; 
	
	if(p != NULL){
	
		left = Calc_Hight(p->LChild);	//	遍历该节点的左子树
		
		right= Calc_Hight(p->RChild);	//	遍历该节点的右子树
	
		Max = left>right?left:right; 	//	比较左右子树的高度
	
		 
		return Max+1; 
	}else{
		
		return 0;
	}
}
            </div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/386751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react【五】redux/reduxToolkit/手写connext

文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

系统架构26 - 软件架构设计(5)

特定领域软件体系结构 定义不同定义必备特征领域 基本活动领域分析领域设计领域实现 参与人员建立过程 特定领域软件体系结构的主要目的是在一组相关的应用中共享软件体系结构。 定义 DSSA (Domain Specific Software Architecture) 就是在一个特定应用领域中为一组应用提供组…

算法-16-并查集

并查集简介 并查集&#xff1a;一开始&#xff0c;把a&#xff0c;b&#xff0c;c放入并查集&#xff0c;a自己一个集合&#xff0c;b自己一个&#xff0c;c自己一个 提供的方法 1.boolean isSameSet(a,b)&#xff0c;判断ab是否在同一个集合 2.void union(a,b),把a所…

基于PHP的学生管理系统

前言 基于PHP的学生管理系统&#xff1b; 实现 登录、注册、学生信息、修改学生、删除学生、查询学生、添加学生等功能 &#xff1b; 环境准备 开发平台&#xff1a;PhpStrom2022.1.2 、Phpstudy_pro 数据库&#xff1a;MySQL5.7.26 技术架构 Bootstrap PHP7.3.4html5css3 项目…

vue安装使用less,解决与webpack的冲突

第077个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

C++-带你深度理解string类的常见接口

1. 为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需…

LeetCode周赛——384

1.修改矩阵&#xff08;模拟&#xff09; class Solution { public:vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> ans(m);for(int i 0; i < m; i)for(…

如何写好一个简历

如何编写求职简历 论Java程序员求职中简历的重要性 好简历的作用 在求职过程中&#xff0c;一份好的简历是非常重要的&#xff0c;它甚至可以直接决定能否被面试官认可。一份出色或者说是成功的个人简历&#xff0c;最根本的作用是能让看这份简历的人产生一定要见你的强烈愿…

腾讯云4核8G服务器够用吗?来看看支持多少人访问!

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

基于 Python 的大数据的电信反诈骗系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【c语言】字符串常见函数 下

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

文生图提示词:视角选择

构图和视角 --视角选择 Perspective Choices 涵盖从基本的摄影视角到更复杂和专业的视角技巧&#xff0c;展示了在视觉艺术创作中可以采用的多样化视角选择。 Eye Level 眼平线视角 High Angle 高角度 Low Angle 低角度 Birds Eye View 鸟瞰视角 Worms Eye View 虫视视角 Front…

【51单片机】直流电机驱动(PWM)(江科大)

1.直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等 2.电机驱动…

使用UMAP降维可视化RAG嵌入

大型语言模型&#xff08;LLMs&#xff09;如 GPT-4 已经展示了出色的文本理解和生成能力。但它们在处理领域特定信息方面面临挑战&#xff0c;比如当查询超出训练数据范围时&#xff0c;它们会产生错误的答案。LLMs 的推理过程也缺乏透明度&#xff0c;使用户难以理解达成结论…

Qt之条件变量QWaitCondition详解

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …

C++笔记1:操纵符输入输出

C操纵符用来控制输出控制&#xff0c;一是输出的形式&#xff0c;二是控制补白的数量和位置。本文记录一下&#xff0c;在一些笔试的ACM模式可能有用。其中1-4节的部分是关于格式化输入输出操作&#xff0c;5-6节的部分是关于未格式化输入输出操作。 1. 控制布尔值的格式 一般…

uniapp API文档地址 以及 HBuilder安装

uniapp API文档地址 以及 HBuilder安装 一、进入 当前网站 uni-app 官网 [uni-app](https://zh.uniapp.dcloud.io/quickstart-hx.html)二、点击截图下载文件 三、 进入 当前网站 &#xff08;https://www.dcloud.io/hbuilderx.html&#xff09; 浏览器会识别 也可以自行选择…

基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析

详情点击公众号&#xff1a;技术科研吧 链接&#xff1a;基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析 前沿 当空间大数据、云计算与人工智能发生碰撞,地理服务产业也不断发生变革与进步。ArcGIS Pro 是一个专业的桌面 GIS 应用程…

17 外排序

排序分为内排序和外排序&#xff0c;内排序是在内存中的排序。外排序指在磁盘中文件的排序&#xff0c;因为在磁盘中&#xff0c;不能进行下标访问&#xff0c;归并排序经常用于磁盘中文件的排序 假如有10亿个整形数据在磁盘中&#xff0c;要对它排序&#xff0c;内存中只有1G…