【数据结构】二叉树的前中后序遍历(C语言)

文章目录

  • 什么是二叉树
    • 树相关的概念
    • 树的表示形式
    • 特殊的二叉树
    • 如何创造出一棵二叉树
    • 二叉树的遍历
      • 先序遍历(前序遍历)
      • 中序遍历
      • 后序遍历
    • 总结

什么是二叉树

[二叉树] 顾名思义就是有两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点;
由于结构像一棵倒立的树,顾名思义为二叉树

在这里插入图片描述

如下图所示,该图即为一棵野生的二叉树

在这里插入图片描述

既然二叉树为树,固然有着和树一样的部分(叶子、根、分支…)
这些也成为了树相关的概念;


树相关的概念

  • 叶子节点或者终端节点

叶子节点或终端节点,顾名思义就是最底端的节点,该节点不存在分支,故被称为叶子;

在这里插入图片描述


  • 节点的度

节点的度即为一个节点含有的子树成为该节点的度,如图所示,节点C的度为3;

在这里插入图片描述


  • 双亲结点(父节点)

若是一个节点存在子节点则该节点成为该子节点的父节点;如上图所示,A节点既是B的父节点,也是C的父节点;


  • 兄弟节点

具有相同父节点的节点成称为兄弟节点,“双亲结点”中所提到的“A结点既是B的父节点,也是C的父结点”处中的BC节点即为兄弟节点。


  • 树的度

树的度即为一棵树中,最大的节点的度,如“结点的度”中的C节点,该节点为整棵树中度最大的结点为3,故该树的度为3;


  • 树的高度或深度

树中结点的最大层次即为树的高度,如上图所示,树的高度为3;


  • 堂兄弟节点

双亲在同一层的节点互为堂兄弟,如上图所示,E节点和F节点护卫堂兄弟节点;


  • 节点的祖先

从根到节点所经分支上的所有节点,如上图所示,A节点为所有节点的祖先;


  • 子孙

以某节点为根的子树中任意一个节点都称为该节点的子孙
如上图所示,除A以外的所有其他节点都为A节点的子孙;


  • 森林

由m(m>0)棵互不相交的树的集合称为森林;


树的表示形式

树的结构与线性表相比就会更加复杂,既要保存值域,同时也要保存树中节点与节点之间的关系;在树中有许多的表示方法(双亲表示法、孩子表示法、孩子双亲表示法、孩子兄弟表示法等等),在此就不做过多赘述;

既然树的结构如此复杂,那对于真正实际中,树有什么应用呢?大家可以将计算机中的文件夹进行比较,从一个文件夹可以分支出很多个文件夹,文件夹内还可以继续存放文件夹,如此;
在Linux操作系统就应用了文件目录树,目录树的起点是根目录,Linux文件系统中的每一文件在此目录树中的文件名都是独一无二的,因为其包含从根目录开始的完整路径;
同时在很多算法中,都运用到了树;


特殊的二叉树

二叉树在树中也算是一个比较特殊的树种,但在二叉树中也存在着特殊的二叉树,即为完全二叉树与满二叉树

  • 满二叉树
    一个二叉树,如果每一层的节点树都达到最大值,则这个二叉树就是满二叉树;也就是说,如果一个二叉树的层数为k,且节点总数是2^k-1,则它就是满二叉树;
  • 完全二叉树
    完全二叉树是一种效率很高的树,是由满二叉树引申出来的。对于深度为k的,有n个节点的二叉树,当且仅当其每个节点都与深度k的满二叉树中编号从1至n的节点一一对应时称为完全二叉树,同时满二叉树也是一种特殊的完全二叉树。
    在这里插入图片描述

如何创造出一棵二叉树

在不使用任何算法的前提下若是想得到一棵二叉树可以使用比较简单粗暴的方式:

将各个节点创建并将每个节点连接在一起(该方法适用于任何一种树);

根据树的结构我们可以得知,树既要保存值域,同时也要保存节点之间的关系,又因为为二叉树(每个节点必有两个分支)

假设需要创建一个如图所示的二叉树
在这里插入图片描述

在此处可以定义一个结构体,并在结构体内存放结构体指针用来存放左右两个子树,同时创建一个成员变量用来存放所需要存储的值域

typedef char BTDataType;
typedef struct BinaryNode
{
	struct BinaryNode*left;
	struct BinaryNode*right;
	BTDataType a;
}BTNode;

根据图所示可知,A节点的子节点为B、C;
B节点的子节点为D、E;
C节点的子节点为F、G;

	int main()
	{
		BTNode q1;
		BTNode q2;
		BTNode q3;
		BTNode q4;
		BTNode q5;
		BTNode q6;
		BTNode q7;
 		
 		q1.a = 'A';
 		q2.a = 'B';
 		q3.a = 'C';
 		q4.a = 'D';
 		q5.a = 'E';
 		q6.a = 'F';
 		q7.a = 'G';

		q1.left = &q2;
		q1.right = &q3;
		q2.left = &q4;
		q2.right = &q5;
		q3.left = &q6;
		q3.right = &q7;
		q4.left = q4.right = q5.left = q5.right =q6.left = q6.right = q7.left = q7.right =NULL;
		
		return 0;
	}

二叉树的遍历

二叉树的遍历分为先序遍历,中序遍历,后序遍历以及层序遍历

为什么会叫先中后,顾名思义,这里的先中后为遍历过程中根节点的访问顺序,一棵树的任意子树都可以看成根节点和子树;
至于层序遍历,即为一层一层的进行访问;

首先设存在一棵二叉树
在这里插入图片描述

先序遍历(前序遍历)

先序遍历的遍历方式为:根、左子树、右子树
按照该树可以得出,该树的前序遍历为:A,B,D,E,C,F,G

根据根、左子树、右子树的顺序可知,最先访问的必定是A节点,当A节点访问完即访问左子树,而左子树的根节点为B,B访问结束访问B的左子树,为D,D没有左右子树(为空)故返回访问B的右子树,E与D同理,而后B访问结束放回根节点A并访问A的右树,同理得出该树的前序遍历为 A,B,D,E,C,F,G

既然看图可以得出树的前序遍历,那在代码中如何表示出二叉树的前序遍历,该处只需要使用递归的方式,按照根、左、右的方式即可;

void BinaryTreePreOrder(BTNode*root)
{
	if(root==NULL){//当root为空时则表示该处无节点,即无存储有效数据,若是访问则会造成对空指针的非法解引用
		printf("NULL");
		return ;
	}
	printf("%c ",root->a);//若是不为空则打印出该节点内所存储的有效数据
	BinaryTreePreOrder(root->left);//访问该节点的左子树
	BinaryTreePreOrder(root->right);//访问该节点的右子树
}

如图所示
在这里插入图片描述


中序遍历

中序遍历的遍历顺序为:左子树、根、右子树
按照该树可得出中序遍历的结果为:D,B,E,A,F,C,G;

若是用代码方式表示即为:

void BinaryTreeInOrder(BTNode*root)
{
	if(root==NULL){//当root为空时则表示该处无节点,即无存储有效数据,若是访问则会造成对空指针的非法解引用
		printf("NULL");
		return;
	}
	printf("%c ",root->a);//若是不为空则打印出该节点内所存储的有效数据
	BinaryTreeInOrder(root->left);//访问该节点的左子树
	BinaryTreeInOrder(root->right);//访问该节点的右子树
}

后序遍历

中序遍历的遍历顺序为:左子树、右子树、根
按照该树可得出中序遍历的结果为:D,E,B,F,G,C,A;

若是用代码方式表示即为:

void BinaryTreePostOrder(BTNode*root)
{
	if(root==NULL){//当root为空时则表示该处无节点,即无存储有效数据,若是访问则会造成对空指针的非法解引用
		printf("NULL");
		return;
	}
	BinaryTreePostOrder(root->left);//访问该节点的左子树
	BinaryTreePostOrder(root->right);//访问该节点的右子树
	printf("%c ",root->a);//若是不为空则打印出该节点内所存储的有效数据

}

总结

二叉树除了前中后序遍历以外还有一种遍历方式叫作层序遍历,可以使用队列的FIFO特性从而完成该遍历的实现;
在利用递归实现解决二叉树相关问题的过程中,可以根据实际情况选择相应的遍历方式从而以效率较高的方式解决问题;
所有的二叉树问题都可以将其分为两个子问题进行解决;

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

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

相关文章

matlab入门

命名规则: clc:清除命令行的所有命令 clear all:清除所有工作区的内容 注释:两个% 空格 %% matlab的数据类型 1、数字 3 3 * 5 3 / 5 3 5 3 - 52、字符与字符串 s a %% 求s的ascill码 abs(s) char(97) num2str(65) str I…

curl: (56) Recv failure : Connection reset by peer

文章目录 背景原因可能如下1. 服务器端关闭了连接2. 网络问题3. 防火墙或代理问题4. 服务器负载过高 解决办法 背景 docker容器里有http服务,今天在docker容器重启时,去调用http接口,出现了以下错误: curl: (56) Recv failure :…

记一次ruoyi中使用Quartz实现定时任务

一、首先了解一下Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标…

Deepin/UOS Linux 桌面自定义 IDEA/DataGrip 应用程序图标

在 $HOME/Desktop目录下编辑 vim jetbrains.intelij.idea.desktop [Desktop Entry] TypeApplication NameIntelij IDEA Icon/opt/module/idea-IU-203.8084.24/bin/idea.png Exec/opt/module/idea-IU-203.8084.24/bin/idea.sh Terminalfalse CategoriesDevelopment;IDE;vim je…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

Block

文章目录 前言Block本质Block循环引用解决循环引用1.__weak __strong协作2.__block3.参数传递 Block中对象的引用计数Block Copy__blockBlock的分类 前言 之前学过Block了,那就在学学 之前学习Block的博客 参考 提示:以下是本篇文章正文内容&#xff…

AtcoderABC249场

A - JoggingA - Jogging 题目大意 高桥和青木一起慢跑,高桥每隔 ACAC 秒钟走 BB 米,然后休息 CC 秒钟,青木每隔 DFDF 秒钟走 EE 米,然后休息 FF 秒钟。现在已经过去了 XX 秒钟,问谁跑得更远。 思路分析 模拟来解决这…

【广州华锐互动】智慧交通3D可视化交互平台

智慧交通3D可视化交互平台由广州华锐互动开发,是一种基于现代科技的智能交通管理系统,它能够实现对车站内部人员和车辆的实时监控和管理。该平台采用了先进的三维可视化技术,将车站内部的结构和设备以立体、直观的方式呈现在用户面前&#xf…

【云原生】Docker网络Overlay搭建Consul实现跨主机通信

目录 1.overlay网络是什么? 实现overlay环境 1.overlay网络是什么? 在Docker中,Overlay网络是一种容器网络驱动程序,它允许在多个Docker主机上创建一个虚拟网络,使得容器可以通过这个网络相互通信。 Overlay网络使用…

echarts 横向柱状图 刻度标签

echarts 横向柱状图 刻度标签 怎么调试都不左对齐 将width去掉固定宽度 echarts会自适应

tql!一款Go编写的RAT主机管理工具

工具介绍 这是一款使用go编写的RAT主机群管理工具,已具备命令控制台、文件管理、屏幕截屏、开机启动服务、NPS代理等功能。 流量:支持TCP,UDP/KCP协议,通讯默认使用tls证明书进行加密 关注【Hack分享吧】公众号,回复…

数据结构初阶--排序2

目录 前言快速排序思路hoare版本代码实现挖坑法代码实现前后指针法代码实现 快排优化三项取中法代码实现三指针代码实现 快排非递归代码实现 归并排序思路代码实现归并非递归代码实现 计数排序思路代码实现 前言 本篇文章将继续介绍快排,归并等排序算法以及其变式。…

Docker本地镜像发布到阿里云

我们构建了自己的镜像后,可以发布到远程镜像提供给其他人使用,比如发布到阿里云 使用build/commit生成新的镜像,并生成自己镜像的版本标签tag,此新的镜像在自己的本地库中,使用push可以将镜像提交到阿里云公有库/私有库…

FPGA——pwm呼吸灯

文章目录 一、实验环境二、实验任务三、实验过程3.1 verilog代码3.2 引脚配置 四、仿真4.1 仿真代码4.2 仿真结果 五、实验结果六、总结 一、实验环境 quartus 18.1 modelsim vscode Cyclone IV开发板 二、实验任务 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化…

数据结构顺序表,实现增删改查

一、顺序表结构体定义 #define MAXSIZE 8 //定义常量MAXSIZE,表示数据元素的最大个数为8 typedef int datatype; //重定义int类型,分别后期修改顺序表中存储的数据类型 typedef struct {int len; //顺序表长度datatype data[MAXSIZE…

考研线性代数考点总结

一.行列式 1.数字型行列式 数字行列式的计算含零子式的分块计算 2.行列式的性质 |A||A^T|交换行列,行列式的值变号含公因子的提出或乘进去把某行的K倍加到另一行,行列式的值不变。行列式可以根据某一行或某一列分拆 3.抽象行列式 n阶或高阶行列式 常…

自动驾驶MCU 软件架构说明

目录 1 文档... 2 1.1.1 变更历史... 2 1.1.2 Term.. 2 1.1.3 引用文档... 2 2 MCU软件框架图... 3 3 模块介绍... 3 文档 变更历史 版本Version 状态 Status 内容 Contents 日期 Date 撰写 Editor 批准 Approver V0.1 …

Spring Boot单元测试

前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 Spring Boot 中进行单元测试是一个常见的做法,可以帮助你验证…

opencv -13 掩模

什么是掩膜? 在OpenCV中,掩模(mask)是一个与图像具有相同大小的二进制图像,用于指定哪些像素需要进行操作或被考虑。掩模通常用于选择特定区域或进行像素级别的过滤操作。 OpenCV 中的很多函数都会指定一个掩模&…

Python 算法基础篇之 Python 语言回顾:变量、条件语句、循环语句、函数等

Python 算法基础篇之 Python 语言回顾:变量、条件语句、循环语句、函数等 引言 1. 变量2. 条件语句3. 循环语句 a ) for 循环 b ) while 循环 4. 函数总结 引言 Python 是一种流行的编程语言,具有简洁而易读的语法。在学习算法时,了解 Python…