数据结构——二叉树的遍历【前序、中序、后序】

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记 、C语言系列函数实现
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~

复习巩固:🥳🥳

在学习二叉树基本操作前,再回顾下二叉树的概念,二叉树是:

  1. 空树
  2. 非空:根节点,根节点的左子树、根节点的右子树组成的。
    在这里插入图片描述
    从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。

一、手动创建一个简单二叉树🥳🥳

在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。

手动创建简单二叉树代码如下:

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	newnode->right = NULL;
	newnode->data = x;
	newnode->left = NULL;
	return newnode;
}
BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	return node1;
}

创建的二叉树逻辑结构如下图:
在这里插入图片描述

💥💥注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。

二、二叉树的三种遍历✨✨

学习二叉树结构,最简单的方式就是遍历。
所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。
遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。

1.前序

前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
也就是先访问根结点在访问左子树右子树,左子树也是先访问根结点再访问左子树右子树…知道结束出现NULL;

前序遍历递归图解:
在这里插入图片描述

💫💫这里要注意访问叶子结点时要将它左右也就是NULL访问,这样才不会出差错。不能说它没有左右子树,而是它的孩子结点为NULL。

代码如下:

// 二叉树前序遍历
void PreOrder(BTNode* root)
{
	if (root)//如果root为NULL就不需要进入if语句直接退出函数
	{
		printf("%d\n", root->data);
		PreOrder(root->left);
		PreOrder(root->right);
	}
}

递归图解如下:
在这里插入图片描述
结果如下:
在这里插入图片描述

2.中序

中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
也就是先访问左子树再访问根结点最后访问右子树,先访问的左子树也是先访问其左子树再访问根结点最后访问右子树…直到遍历完全部结点。

代码如下:

// 二叉树中序遍历
void InOrder(BTNode* root)
{
	if (root)
	{
		InOrder(root->left);
		printf("%d\n", root->data);
		InOrder(root->right);
	}
}

结果如下:
在这里插入图片描述

3.后序

后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
也就是先访问左子树再访问右子树最后访问根结点,再访问左子树时也是按照左子树——右子树——根结点的顺序访问…直到遍历整个二叉树。

代码如下:

// 二叉树后序遍历
void PostOrder(BTNode* root)
{
	if (root)
	{
		PostOrder(root->left);
		PostOrder(root->right);
		printf("%d\n", root->data);

	}
}

结果如下:
在这里插入图片描述

三、小练习🥰🥰

在这里插入图片描述

解答:
在这里插入图片描述

四、结语🌹🌹

✨✨由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

以上就是二叉树前中后序的遍历啦~学习它对我们后续学习二叉树的操作有很大作用同时也帮我们复习和了解递归的使用,可谓一举两得,大家都get到了吗, 完结撒花 ~🥳🥳🎉🎉🎉

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

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

相关文章

【精选】30+Redis面试题整理(2024)附答案

目录 前言Redis基础项目有用到redis吗?你们项目为什么用redis?redis为什么这么快?了解Redis的线程模型吗?Redis优缺点?redis如何实现持久化?RDB持久化过程?AOF持久化过程?AOF持久化会出现阻塞吗&#xff…

svn安装与汉化(svn1.14.5版本)带汉化包

安装 下载 TortoiseSVN 去官网下载 TortoiseSVN,找到页面底部 TortoiseSVN 下载,选择适用自己电脑位数的 TortoiseSVN 客户端下载: 或者 链接:https://pan.baidu.com/s/1YSw9LalULsQecOQgFrXGSQ?pwd4ds7 提取码:4ds…

套接字编程 --- 三

目录 1. 前置性知识 1.1. listen 系统调用 1.2. accept 系统调用 1.3. 如何通信 1.3.1. read 系统调用 && write系统调用 1.3.2. recv 系统调用 && send 系统调用 2. TCP --- demo 2.1. Tcp_Server.hpp (version 1) 2.2. Tcp_Server.hpp (version 2…

【存储】ZYNQ+NVMe小型化全国产存储解决方案

文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…

【鸿蒙 HarmonyOS 4.0】Web组件

一、介绍 页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景,包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 二、加载网页 2.1、加载在线网页 Web组件的使用非常简单,只需要在Page目录下的ArkTS文件中创建一个…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColo…

基于Python3的数据结构与算法 - 15 栈和队列的应用(迷宫问题)

题目 给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出算法,求一条走出迷宫的路径。 方法一 :使用栈 -- 深度优先搜索 方法:回溯法 思路:从一个节点开始,任意找下…

OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博…

基于Java+SpringBoot+vue+element实现汽车订票管理平台详细设计和实现

基于JavaSpringBootvueelement实现汽车订票管理平台详细设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 …

开源好用的所见即所得(WYSIWYG)编辑器:Editor.js

文章目录 特点基于区块干净的数据 界面与交互插件标题和文本图片列表Todo表格 使用安装创建编辑器实例配置工具本地化自定义样式 今天介绍一个开源好用的Web所见即所得(WYSIWYG)编辑器: Editor.js Editor.js 是一个基于 Web 的所见即所得富文本编辑器,它…

【毕设级项目】基于AI技术的多功能消防机器人(完整工程资料源码)

基于AI技术的多功能消防机器人演示效果 竞赛-基于AI技术的多功能消防机器人视频演示 前言 随着“自动化、智能化”成为数字时代发展的关键词,机器人逐步成为社会经济发展的重要主体之一,“机器换人”成为发展的全新趋势和时代潮流。在可预见的将来&#…

鸿蒙App基础

基础说明 .1、应用模型 .1.1、构成要素 应用组件 应用组件是应用的基本组成单位,是应用的运行入口。用户启动、使用和退出应用过程中,应用组件会在不同的状态间切换,这些状态称为应用组件的生命周期。应用组件提供生命周期的回调函数&…

如何提高API接口的性能和设计安全可靠的API

如何提高API接口的性能 下图显示了提高 API 性能的 5 种常见技巧。 分页 这是在结果集较大时常用的优化方法。结果会以流式方式传回客户端,以提高服务响应速度。 异步日志 同步日志每次调用都要处理磁盘,会降低系统速度。异步日志会先将日志发送到无…

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历,每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n);其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh);其…

任务执行中拖延的认知神经机制

任务执行中拖延的认知神经机制 引言 虽然动机的产生往往是人们行动的前提(Ajzen, 2011;林琳&白新文,2014),但动机的产生却并不必然地导致随后的行为(Rhodes&deBruijn,2013;Sniehotta, Scho1z, & Schwarzer, 2005)。动机向行为的转换依赖于一系列自我控…

北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据

北京是一座有着三千多年历史的古都,在不同的朝代有着不同的称谓,大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山,东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有:永定河、潮白河、北运…

Ollama 只安装 Ollama,本地快速部署谷歌开源大模型Gemma(基于Ollama)

参考:本地快速部署谷歌开源大模型Gemma(基于Ollama) - 知乎 确保系统更新: Bash sudo apt update && sudo apt upgrade 需要先下载Ollama,版本要求0.1.26及以上 运行curl -fsSL https://ollama.com/install.sh | sh 监听 Ollama API 接…

常见的限流算法- python版本

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 在系统的稳定性设计中,需要考虑到的就是限流,避免高并发…

【VUe】简略学习 vue

Vue 是一套用于构建用户界面的渐进式框架。要想使用这个框架,就需要先在页面中引用: 如何使用: 来到控制台: 数据绑定 若要在标签里替换,就需要使用 v-bind 指令了: 在标签里(尖括号里&#xf…

数据库insert详细用法

数据库版本:KingbaseES V008R006C008B0014 简介 INSERT 语句用于将数据插入表中,向指定表格添加1行或多行数据,本篇文章主要以kingbase介绍insert的一些技巧。 文章目录如下 1. 基本语法 2. 实用技巧 2.1. 插入其他表数据 2.2. 快速插入万…