14-数据结构-二叉树的创建以及前中后遍历,以及结点和叶子节点的计算(C语言)

news2024/12/23 19:07:51

概述:

        二叉树,这里采用孩子链表存储法,即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候,先创建各个二叉树结点(这里的结点采用动态分配,因此结点为指针变量),随后,再根据逻辑结构图,手动通过左右指针域,链接到对应位置即可。

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
//二叉树结点 
typedef struct BTnode
{
	int data;
	struct BTnode *lchild,*rchild;
}BTnode;

BTnode* BuyNode(int x)
{
	//创建树的结点空间,动态分配。 
	BTnode* node =(BTnode*)malloc(sizeof(BTnode));
	//给结点赋值,指针域置空 
	node->data=x;
	node->lchild=NULL;
	node->rchild=NULL;
	return node; 
} 
//创建二叉树
BTnode* CreatTree()
{
	//创建树的结点 
	BTnode* node1 =BuyNode(1);//因为BuyNode是动态分配的空间,因此用指针接收	
	BTnode* node2 =BuyNode(2);
	BTnode* node3 =BuyNode(3);
	BTnode* node4 =BuyNode(4);
	BTnode* node5 =BuyNode(5);
	//手动链接起来。
	node1->lchild=node2;
	node1->rchild=node3;
	node2->lchild=node4;
	node2->rchild=node5; 
	
	//链接完毕,返回头指针,即根结点
	return node1; 
} 
//打印树-前序遍历 
void PreOrder(BTnode* root)
{
	if(root == NULL)
	{
		printf("# ");
		return;//返回调用的上一级 
	}
	printf("%d ",root->data);
	PreOrder(root->lchild);
	PreOrder(root->rchild);
} 
void InOrder(BTnode* root)//中序遍历 
{
	if(root == NULL)
	{
		printf("# ");
		return;//返回调用的上一级 
	}
	
		
		InOrder(root->lchild);  //左 
		printf("%d ",root->data);//根 
		InOrder(root->rchild);//右 
	
} 
void PostOrder(BTnode* root)//后序遍历 
{
	if(root == NULL)
	{
		printf("# ");
		return;//返回调用的上一级 
	}
	
		PostOrder(root->lchild);//左 
		PostOrder(root->rchild);// 右 
		printf("%d ",root->data);//根 
	
} 
//计算树的结点,分治思想,分工,最后汇总。
int BTtreeSize(BTnode* root)
{
	if(root ==NULL)//树是空的,就返回0 
	return 0;
	else//不是空的,就进行左右子树遍历再加1,因为要给本身加上。空根不加一,但这里非空,必定+1; 
	{
		//递归到叶子节点时,叶子节点的左右子树都为空,返回0,0+0+1=1,因此叶子节点再往上一层返回即可。 
		return	BTtreeSize(root->lchild)+BTtreeSize(root->rchild)+1;	
	}	
} 
//计算树的叶子节点
int LeafSizes(BTnode* root)
{
	//是空根就返回0
	if(root ==NULL)
	return 0;
	//符合叶子结点特征,即结点的左右子树均为空,则返回1,即记录上 
	if(root->lchild ==NULL && root->rchild==NULL )
	return 1;
	else
	//都不符合,便进入左右子树,进行递归计算,最后汇总即可。 
	return LeafSizes(root->lchild)+LeafSizes(root->rchild);	
	//实在不明白,画个递归图,就明白了。 
} 

int main()
{
	BTnode* root=CreatTree();
	//遍历递归打印时,每个结点调用结束,销毁空间,返回上一级调用位置。
	//直到所有结点遍历结束,临时空间逐个销毁。 
	printf("前序遍历:");
	PreOrder(root);
	printf("\n中序遍历:");
	InOrder(root);
	printf("\n后序遍历:");
	PostOrder(root); 
	//计算树的结点 
	int count=BTtreeSize(root);
	printf("\n树有%d个结点",count);
	int leafcount=LeafSizes(root);
	printf("\n树有%d个叶子结点",leafcount);
	return 0;
 } 

结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言中编译过程与预处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、c语言的编译与链接1、编译与链接概述2、编译与链接详解 二、c语言预处理1.c语言中内置的预定义符号2、#define定义标识符3、#define定义宏4、#define 替换规…

项目进度管理软件:选择最适合您的工具

项目进度管理作为项目管理的重要组成部分&#xff0c;可以帮助项目团队更好地控制项目进度&#xff0c;确保项目按时完成并达到预期目标。本文将介绍项目进度管理软件的功能以及市场上常见的几种项目进度管理软件。 “项目进度管理软件有哪些?功能出色的有Zoho Projects、Trel…

ResNet 模型原理

ResNet与Vgg的主要区别&#xff1a; 1.ResNet相较于Vgg具有更加深的网络结构 2.ResNet相较于Vgg引入了残差连接的结构 3.ResNet引入了BatchNorm层&#xff0c;使得ResNet能够训练更加深的网络结构 4.ResNet使用stride2的卷积层代替了Vgg中池化层进行下采样 5.ResNet相较于…

【在Windows下搭建Tomcat HTTP服务】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

报错:1 字节的 UTF-8 序列的字节 1 无效。

这里我的问题出现在BookMapper.xml中 java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)at org.spring…

情人节特别篇:用c++弹奏音乐“海阔天空”与“孤勇者”

W...Y的主页 &#x1f495; 代码库分享 &#x1f60a; 目录 孤勇者 海阔天空 今天是2023年8月22日七夕情人节&#xff0c;但是对我来说就是再普通不过的日子。我相信有很多人期待这一天的到来&#xff0c;和自己的对象出去享受快乐时光。但是我只有一个人独孤的度过短暂的时…

1.7 【MySQL】常用存储引擎

MySQL 支持非常多种存储引擎&#xff0c;我这先列举一些&#xff1a; 存储引擎 描述 ARCHIVE 用于数据存档&#xff08;行被插入后不能再修改&#xff09; BLACKHOLE 丢弃写操作&#xff0c;读操作会返回空内容 CSV 在存储数据时&#xff0c;以逗号分隔各个数据项 FEDE…

自动控制原理笔记-采样控制系统

目录 采样控制系统的基本概念&#xff1a; 采样过程及采样定理&#xff1a; 一、采样过程 二、采样定理&#xff08;香农采样定理、奈奎斯特采样定律&#xff09; 三、信号复现 四、零阶保持器 z变换与z反变换&#xff1a; z变换的定义 z变换基本定理 z反变换 采样系…

Oracle 如何给大表添加带有默认值的字段

一、讲故事 你是否遇到过开发人员添加字段&#xff0c;导致数据库锁表问题&#xff1f; 但是令开发疑惑的事&#xff0c;他们添加字段&#xff0c;有的时候很快&#xff0c;有的时候很慢&#xff1f; 为什么呢&#xff1f; 询问得知&#xff0c;**加的慢时候是带上了default默…

提高软件缺陷探测率的5个重点

缺陷对软件项目的影响不言而喻&#xff0c;如果不重视缺陷的探测率和移除率&#xff0c;往往会对软件产品产生不可估量的破坏性影响&#xff0c;直接影响项目进度甚至项目交付。 因此我们需要高效提高软件缺陷探测率&#xff0c;一般来说有以下5个方面需要重点关注&#xff1a;…

Linux--线程地址空间

1.程序地址空间 先来就看这张图 这是一张程序地址分布的图&#xff0c;通过一段代码来证明地址空间的分布情况 编译结果&#xff1a; 可以看出的是&#xff0c;父子进程中对于同一个变量打印的地址是一样的&#xff0c;这是因为子进程以父进程为模板&#xff0c;因为都没有对数…

深度丨Serverless + AIGC,一场围绕加速创新的升维布局

作者&#xff1a;褚杏娟 上图来源于基于函数计算部署 SD实现光影效果 前言&#xff1a; Serverless 在中国发展这些年&#xff0c;经历了高潮、低谷、现在重新回到大众视野。很多企业都非常感兴趣&#xff0c;部分企业开始大规模应用&#xff1b;也有一些企业对在生产环境真正…

VGG的结构:视觉几何组(Visual Geometry Group)

目录 1. VGG 的结构 2. VGG 的网络细节 3. VGG 的代码实现 1. VGG 的结构 牛津大学的视觉几何组&#xff08;Visual Geometry Group&#xff09;设计了 VGGNet(也称为 VGG)&#xff0c;一种经典的卷积神经网络 (CNN) 架构。在 2014 年 ILSVRC 分类任务中&#xff0c;VGG 取…

回归分析扫盲:为什么非线性模型不能直接用最优子集选择法

最近有人给我发了篇文章&#xff1a; 一个问题有一堆变量&#xff0c;我们要选取哪些变量来建模呢&#xff1f;我们来看看这篇文章是怎么做的&#xff1a; 这个方法简单来说就是&#xff1a;对于这一堆变量&#xff0c;我们每次尝试剔除其中一个变量&#xff0c;然后用剩下的变…

字节流概述,及字节流写数据的三种方式

1.IO流概述和分类 如果数据通过记事本打开&#xff0c;我们还可以读懂里面的内容就使用字符流&#xff0c;否则使用字节流。如果不知道使用哪种类型的流&#xff0c;就使用字节流。 2.字节流写数据 创建字节输出流的时候&#xff0c;一共做了三件事情。 调用系统功能创建了文…

Goland 配置go modules 环境变量

我的配置&#xff0c;仅供参考&#xff1a; GOPROXYhttps://goproxy.cn,direct;GO111MODULEon;GOSUMDBoff;GONOSUMDB*

spring整合mybatis教程(详细易懂)

一、引言 1、Spring整合MyBatis的目的是&#xff1f; 将两个框架结合起来&#xff0c;以实现更好的开发体验和效果。Spring提供了一种轻量级的容器和依赖注入的机制&#xff0c;可以简化应用程序的配置和管理。而MyBatis是一个优秀的持久层框架&#xff0c;可以方便地进行数据…

Mysql join加多条件与where的区别

最近在项目中遇到一个问题&#xff0c;感觉有点意思&#xff0c;在解决问题及查阅了相关资料后&#xff0c;打算写篇文章给朋友们分享一下。 问题现象&#xff1a; 问题是很常见的空指针问题&#xff0c;后端查询数据库数据&#xff0c;遍历进行相关业务处理时报空指针。通过…

stm32单片机实现电机的PID控制

PID控制应该算是非常古老而且应用非常广泛的控制算法了&#xff0c;小到热水壶温度控制&#xff0c;大到控制无人机的飞行姿态和飞行速度等等。在电机控制中&#xff0c;PID算法用得尤为常见。 一、位置式PID 1.计算公式 在电机控制中&#xff0c;我们给电机输出的是一个PWM占…

分布式计算框架:Spark、Dask、Ray

目录 什么是分布式计算 分布式计算哪家强&#xff1a;Spark、Dask、Ray 2 选择正确的框架 2.1 Spark 2.2 Dask 2.3 Ray 什么是分布式计算 分布式计算是一种计算方法&#xff0c;和集中式计算是相对的。 随着计算技术的发展&#xff0c;有些应用需要非常巨大的计算能力才…