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

概述:

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

代码如下:

#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)
{//是空根就返回0if(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.mzph.cn/news/52831.shtml

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

相关文章

(三)Linux中卸载docker(非常详细)

docker 卸载 使用yum安装docker 如需卸载docker可以按下面步骤操作&#xff1a; 1、停止docker服务 systemctl stop docker 2、查看yum安装的docker文件包 yum list installed |grep docker 3、查看docker相关的rpm源文件 rpm -qa |grep docker 4、删除所有安装的docke…

4.1011

目录 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 在 TIME_WAIT 状态的 TCP 连接&#xff0c;收到 SYN 后会发生什么&#xff1f; 四次挥手中收到乱序的FIN包会如何处理&#xff1f; 如果FIN报文比数据包先道道客户端&#xff0c;此时FIN是一个乱序报文&#xff0c;此时…

Postgresql部署及简单操作

目录 1、介绍 2、什么是PostgreSQL 3、PostgreSQL 的特点 4、数据库定为 5、环境准备 6、编译安装 6.1 安装依赖包 6.2 下载安装包 6.3 创建用户 6.4 创建 postgresql数据目录并授权 6.5 上传压缩包并解压 6.6 编译postgresql源码 6.7 配置环境变量 6.8 初始化数…

LeetCode--HOT100题(40)

目录 题目描述&#xff1a;543. 二叉树的直径&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;543. 二叉树的直径&#xff08;简单&#xff09; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最…

Linux--线程地址空间

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

数据结构入门 — 链表详解_双向链表

前言 数据结构入门 — 双向链表详解* 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;数据结构入门 — 链表详解_单链表…

【GeoDa实用技巧100例】025:geoda空间回归分析案例教程

严重声明:本文来自专栏《GeoDa空间计量案例教程100例》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:https://blog.csdn.net/lucky51222/category_12373659.html,谢绝转载或爬取!!! 文章目录 一、空间自回归模型二、Geoda空间回归分析普通最小二乘法回归(OLS)空间…

Linux安装Redis数据库,无需公网IP实现远程连接

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 Redis作为一款高速缓存的key value键值对的数据库,在…

【Vue】vue2项目使用swiper轮播图2023年8月21日实战保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、npm 下载swiper二、使用步骤1.引入库声明变量2.编写页面3.执行js 总结 前言 swiper轮播图官网 参考文章&#xff0c;最好先看完他的介绍&#xff0c;再看…

WPF中的数据转换-StringFormat

WPF中的数据转换-StringFormat 前言 字符串格式化。使用该功能可以通过设置Binding.StringFormat属性对文本形式的数据进行转换——例如包含日期和数字的字符串。对于至少一半的格式化任务&#xff0c;字符串格式化是一种便捷的技术。 使用 当设置Binding.StringFormat属性…

基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic

摘 要 随着消费升级&#xff0c;越来越多的年轻人已经开始不再看重餐饮等行业的服务&#xff0c;而是追求一种轻松自在的用餐、购物环境。因此&#xff0c;无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…

Centos开启防火墙和端口命令

Centos开启防火墙和端口命令 1. 开启查看关闭firewalld服务状态2. 查看端口是否开放3. 新增开放端口4. 查看开放的端口 1. 开启查看关闭firewalld服务状态 #启动/关闭firewall systemctl start/stop firewalld #查看防火墙状态 systemctl status firewalld #禁用或者启用 syst…

pytorch 实现VGG

VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确率&#xff0c;主要有两个方向&#xff1a;小卷积核和多尺度。而VGG的作者们则选择了另外一个方向&a…

[蓝帽杯 2022 初赛]domainhacker

打开流量包&#xff0c;追踪TCP流&#xff0c;看到一串url编码 放到瑞士军刀里面解密 最下面这一串会觉得像base64编码 删掉前面两个字符就可以base64解码 依次类推&#xff0c;提取到第13个流&#xff0c;得到一串编码其中里面有密码 导出http对象 发现最后有个1.rar文件 不出…

Agile Iteration Velocity

【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度&#xff1a; 76 / 4 19 第五次迭代结束速度&#xff1a; &#xff08;76 24 &#xff09; / 5 100 / 5 20

spark第四课

countByValue 数据源中相同的值有多少个,也就是WordCount countByKey 表的是键值对中的key出现了几次,与Value的值无关 不推荐collect,因为他是将数据放入内存,但是内存不够大的话,就容易崩,所以使用saveAsTextFile更好,直接放入磁盘. 保存成对象文件,需要序列化 启动了2个 J…

C++有向、无向完全图的边数

一、无向完全图 一个拥有n个结点的无向完全图的边数为&#xff1a; 公式&#xff1a; 简写&#xff1a; &#xff08;表示个顶点中有条边&#xff09; 具体的解释&#xff1a; 比如我们有一个拥有个结点的无向完全图 我们首尾依次连接&#xff0c;共有条边。 然后我们选择…

九、pikachu之敏感信息泄露

文章目录 1、敏感信息泄露概述2、实战 1、敏感信息泄露概述 由于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; 通过访问url下的目录&#xff0c;可以直接列出目录下的文件列表;输入错误的url参数后报错信息里面…

OpenCV基础知识(7)— 腐蚀与膨胀

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。腐蚀和膨胀是图像形态学中的两种核心操作&#xff0c;通过这两种操作可以清除或者强化图像中的细节。本节课就对OpenCV中的腐蚀和膨胀操作进行详细的介绍。&#x1f308; 前期回顾&#xff1a; OpenCV基础知识&#xff08;…

记录--为什么要使用 package-lock.json?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 随着JavaScript在现代软件开发中的日益重要地位&#xff0c;Node.js生态系统中的npm成为了不可或缺的工具。在npm管理依赖的过程中&#xff0c;package-lock.json文件的作用日益凸显。本文将深入…