【数据结构】二叉树的遍历 - 动图演示

数据结构-二叉树及其遍历 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相关的三种递归遍历、三种非递归遍历以及层次遍历。🍃二叉树 (BinaryTree) 是 n (n>0) 个结点所构成的集合,它或为空树(n-0)或为非空树,对于非空树(1) 有且仅有一个称之为根的结点:(2) 除根结点以外的其余结点分为两个互不相交的子集 TI 和 T2,分别称为 T 的左子树和右子树,且 T1 和 T2 本身又都是二叉树。🍃二叉树与树一样具有递归性质,二叉树与树的区别。 阅读详情


前言

如果你还不知道树及二叉树的概念,请先看这篇文章树和二叉树的介绍

对于二叉树,我们学习的重点是二叉树的结构,而想要学好二叉树的结构,则离不开二叉树的基本操作-二叉树的遍历,二叉树的遍历则离不开递归。因此本文将为你介绍如何进行二叉树的遍历,以及如何更好的理解与使用递归。


一、二叉树的遍历

概念:所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。由于二叉树的结构天然满足递归的使用条件,因此二叉树的遍历通常由递归来完成。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
在这里插入图片描述

注:递归
递归是一种编程技巧,它定义了一个问题的解决方案,该方案可以通过调用自身来解决更小的同类问题并最终得出问题的解决方案。
递归通常在以下情况下使用:

  1. 问题可以被分割为更小的同类问题,且每个子问题可以使用相同的解决方案。
  2. 问题的规模或深度未知或非常大,无法使用迭代或其他方法解决。
  3. 代码的可读性和简洁性比代码效率更为重要时,使用递归可以更容易地实现算法。

由二叉树的定义可知,一个二叉树也是由二叉树组成,一个节点是根节点,同时也可能是左/右孩子节点,这刚好符合递归的第一种使用情况。
在这里插入图片描述

1.1 创建二叉树

要进行二叉树的遍历,首先我们要先创建一颗二叉树。由于二叉树的创建也是建立在遍历的基础上,所有现在我们先手动创建一颗树。

typedef int BTDataType;
typedef struct BinaryTreeNode//Binary 意思为 二叉,二进制
{
	BTDataType val;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

BTNode* BuyNode(int x) {
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	assert(newnode);
	newnode->val = x;
	newnode->left = NULL;
	newnode->right = 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;
}
int main(void) {
	BTNode* root = CreatBinaryTree();
}

在这里插入图片描述


二叉树创建好后,就要开始进行二叉树的遍历了。

1.2 二叉树的遍历方式

我们对于一个二叉树,要将它看作三部分构成:根,左子树,右子树
注:根,左子树,右子树是相对的。例如:2相对于1是左子树,5相对于4是左子树。
在这里插入图片描述
根据访问这三部分的先后顺序,可以分为以下三种遍历方式,它们的名称及访问顺序如下

  • 前序遍历(PreOrder):根,左子树,右子树
  • 中序遍历(InOrder):左子树,根,右子树
  • 后序遍历(PostOrder):左子树,右子树,根

除此之外还有一种遍历方式:
层次遍历(LevelOrder) : 第一层,第二层,第三层……

为了更好的理解它们的含义,下面我们采用动画的形式来演示如何进行前序遍历?

请添加图片描述
因此前序遍历的结果(省去NULL)为 1 2 3 4 5 6
那中序遍历,后续遍历,层序遍历的结果呢?读者不妨先自己动手写一下。
在这里插入图片描述
中序遍历:NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL 即 3 2 1 5 4 6
后序遍历:NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1 即 3 2 5 6 4 1
层序遍历:1 2 4 3 NULL5 6


1.3 二叉树遍历的实现

现在我们已经知道如何进行二叉树的遍历。那怎么用代码来实现呢?在文章开头我们就提到二叉树的遍历需要使用递归,具体代码如下:

以前序遍历为例:

void PreOrder(BTNode* root) {
	//递归的终止条件
	if (root == NULL) {
		printf("NULL ");
		return;
	}
	//我们使用打印来表示访问
	printf("%d ", root->val);
	PreOrder(root->left);
	PreOrder(root->right);
}
//打印结果为:1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL

递归的代码很简洁,但对于新手理解起来有一定难度,我们可以通过画递归展开图来进行理解。
(动图制作不易,麻烦点个赞)
请添加图片描述
在这里插入图片描述
同理,你能写出中序遍历和后序遍历的代码(至于层序遍历,它需要用到队列)
在这里插入图片描述

//中序遍历
void InOrder(BTNode* root) {
	if (root == NULL) {
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->val);	
	InOrder(root->right);
}
//后序遍历
void PostOrder(BTNode* root) {
	if (root == NULL) {
		printf("NULL ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);
}

1.4 层序遍历

不同于上面的三种遍历方式,层序遍历是一种针对树或图等数据结构的遍历方式,它是广度优先搜索(BFS)算法的一种实现。
注:BFS是一种基于队列实现的算法,用于搜索图或树中的节点,以找出某种状态或路径。
要想实现层序遍历,我需要使用队列。
请添加图片描述

void LevelOrder(BTNode* root) {
	Queue q;
	QueueInit(&q);
	if (root) {
		QueuePush(&q, root);
	}
	while (!QueueEmpty(&q)) {
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		printf("%d ", front->val);
		if (front->left) {
			QueuePush(&q, front->left);
		}
		if (front->right) {
			QueuePush(&q, front->right);
		}
	}
	QueueDestroy(&q);
}

二、二叉树的其他操作

// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);

上述操作也离不开递归,但它们其中所用到算法思想并不是遍历,而是采用的分治。至于为什么?我将在这篇博客【数据结构】二叉树的分治中予以解释。


在二叉树的遍历中,了解前序遍历、中序遍历、后序遍历等基本概念,以及它们的应用场景和实现方式是非常重要的。希望本文对读者有所启发,增加对二叉树遍历的理解和掌握,并能够通过实践提高自己的编程能力。在日后的学习和工作中,相信这些知识点会为您带来更多的便利和帮助。

在这里插入图片描述

《数据结构》—— 遍历线索二叉树 中、先、后序线索二叉树的遍历查找,代码实现遍历中序线索二叉树 阅读详情

相关推荐

数据结构——二叉树的遍历

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。二叉树的遍历方式有很多,主要分为以下三种:1.二叉前序遍历规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。注意这里的定义也采用了递归的方式,那么我们如果去理解呢,我们先看一个简单的例子:这是一个最简单的二叉树,我们按照前序遍历的原则,先根结点-A,再左...

ZeroZiano博客 994

猿创征文 | 详解二叉树之遍历及其应用(动图遍历演示)

二叉树的遍历和相关应用的介绍和学习到这里就结束啦~目前简单的一些数据结构基本就拿C实现介绍差不多啦,后面就会进入排序的学习哈。但是在这里,希望大家能够将前面的树的基础概念以及之前的线性结构知识进行回顾复习,使整个纯C数据结构学习是连贯的,这样更加利于我们的学习和理解以及继续拓展。。代码不负有心人,98加满,向前冲啊🐬🎉🎉🎉以上代码均可运行,所用编译环境为 vs2019 ,运行时注意加上编译头文件#define _CRT_SECURE_NO_WARNINGS 1。......

forever的博客 3015

二叉树三种遍历(动态图+代码深入理解)

文章目录一、图示理解(图片是一位前辈所留,在此感谢)1、先序遍历2、中序遍历3、后序遍历4、层序遍历二、深入理解三种遍历让我们来理解一下绕着外围跑一整圈的真正含义是:遍历所有结点时,都先往左孩子走,再往右孩子走。下面做一个实例吧三、代码实现加以理解以下是C语言全部代码实现下面是同样的例子用c++实现,大家可以参考一下 一、图示理解(图片是一位前辈所留,在此感谢) 1、先序遍历 先序遍历可以想象成,...

流楚丶格念的博客 3万+

数据结构——树——二叉树图解动画

文章目录二叉树简介二叉树遍历前序遍历中序遍历后序遍历层序遍历二叉树操作二叉树插入节点二叉树删除节点 二叉树简介 在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,

2780

【数据结构和算法】二叉树详解,动图+实例

???? 作者:Linux猿 ???? 简介:优快云博客专家????,华为云享专家????,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! ???? 关注专栏:图解数据结构和算法(优质好文持续更新中……)???? ???? 欢迎小伙伴们点赞????、收藏⭐、留言???? 【数据结构和算法】超详细,保姆级,动图详解,就怕你不会,二叉树详解 一、什么是二叉树 二、二叉树遍历 2.1 前序遍历 2.2 中序遍历 2.3 后续遍历 2.4 层次遍历 三、二叉

Muti-Agent 1万+

二叉树三种遍历动画演示

数据结构二叉树三种遍历动画演示

C++二叉树动画演示

题目2:基于前序、中序、后序序列构造二叉树 需求: 1、任意输入前序+中序序列或者中序+后序序列,生成二叉树,请使用三叉链表,在构造链表的过程中同步更新每个节点的parent指针; 2、检测输入的前序,中序,后续序列的有效性,例如当用户输入错误的序列时,程序应该有错误提示; 3、利用打印二叉树功能显示二叉树的逐步构造过程(不是仅仅把最后构造的树显示,而是要把算法运行过程中树的每一步的构造过程动态演示出来, 即显示中间过程); 4、如使用命令行程序,请务必学习使用EGE(xege.org)/SFML(www.

程序设计 699

c语言动态演示二叉树的遍历

c语言动态演示二叉树的遍历,包括先序,中序和后序遍历。

leetcode二叉树及三种遍历方式理解(动画演示说明)JavaScript

二叉树 树是一种非线性的数据结构,以分层的方式存储数据。树被用来存储具有层级关系的数据,比如文件系统中的文件;树还被用来存储有序列表。本章将研究一种特殊的树:二叉树。选择树而不是那些基本的数据结构,是因为在二叉树上进行查找非常快(而在链表上查找则不是这样),为二叉树添加或删除元素也非常快(而对数组执行添加或删除操作则不是这样)。 ​ 二叉树是一种特殊的树,它的子节点个数不超过两个。二叉树具有一些特殊的计算性质,使得在它们之上的一些操作异常高效。 二叉树的高度和深度的区别: ​ 高度和深度是相反的表示,深度是

WEXIA666的博客 777

R | 提取文件夹内栅格数据的最小值、最大值、标准差和平均值

各位同学好,我们长需要用长时间序列栅格数据的平均值做变量的时间变化分析,用代码能够帮助我们省下很多时间。

qq_48539301的博客 449

MPLAB修改工程名称方法

修改工程名称方法 如下图所示,工程名称为:Loar_V1.0_20210205 现将该工程名称修改为:Loar_V1.1_20210205 修改方法: ①找到工程文件路径,将工程名称修改为Loar_V1.1_20210205 注意:此时打开变成进行编译,会报错:Loar_V1.1_20210205.production.hex does not exist or is not an executable, ②找到工程下的 nbproject 文件夹 ③将nbproject文件夹下的文件全部打开,并且将

qq_26195179的博客 1759

数据结构简记✏️ | 二叉树遍历&图遍历(动画演示)

遍历基础一、二叉树遍历1. 先序遍历2. 中序遍历3. 后序遍历二、图遍历1. 广度优先遍历2. 深度优先遍历 一、二叉树遍历 1. 先序遍历 动画演示: 2. 中序遍历 动画演示: 3. 后序遍历 动画演示: 二、图遍历 1. 广度优先遍历 动画演示: 2. 深度优先遍历 动画演示: ...

CV工程师的博客 3454

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

首先该问题的出现是由于网络的震荡导致,这是重点。(1)将源更换成阿里云的官方源,步骤参考如上(2)同时将zabbix的官方源更换成阿里云里面的zabbix镜像源,因为zabbix官方源根本网络不通,因为国家防火墙的拦截,导致网络不通。这是阿里源的zabbix镜像地址: https://mirrors.aliyun.com/zabbix/zabbix/4.4/rhel/7/修改系统中早期生成的zabbix.repo文件,如下:主要是把baseurl替换成阿里云的zabbix镜像地址即可。

专注基础架构领域 3875

【数据结构】二叉树的遍历

本章将会详细讲解二叉树的遍历的四种方式,分别为前序遍历、中序遍历、后续遍历和层序遍历。在学习遍历之前,会先带大家回顾一下二叉树的基本概念。学习二叉树的基本操作前,需要先创建一颗二叉树,然后才能学习其相关的基本操作,考虑到我们刚刚接触二叉树,为了能够先易后难地进行讲解,我们将暂时手动创建一颗简单的二叉树,用来方便大家学习。等二叉树结构了解的差不多后,后期我们会带大家研究二叉树地真正的创建方式。

有道无术, 术尚可求。有术无道, 止于术。 1万+

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 652

MATLAB 控制 E4438C 信号源的研究

通过 MATLAB,我们可以实现对 E4438C 的远程控制,从而实现更高的自动化和可编程性。总结起来,通过使用 MATLAB 和 Instrument Control Toolbox,我们可以轻松地控制 E4438C 信号源并生成各种类型的信号。需要注意的是,以上代码仅为示例,实际应用中可能需要根据具体情况进行更详细的配置和错误处理。此外,MATLAB 还提供了一系列函数和命令,可用于控制 E4438C 信号源的其他功能,如频率调谐、功率设置、调制设置等。您可以根据自己的需求进行相应的配置和控制。

RswtPerl的博客 1014

数据结构——遍历二叉树

遍历定义-- 顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次(又称周游)。“访问”的含义很广,可以是对结点作各种处理,如:输出结点的信息、修改结点的数据值等,但要求这种访问不破坏原来的数据结构。遍历目的-- 得到树中所有结点的一个线性排列。遍历用途--它是树结构插入、删除、修改、查找和排序运算的前提,是二又树一切运算的基础和核心。遍历方法依次遍历二叉树的三个组成部分,便是遍历了整个二叉树。

weixin_74209413的博客 3732

极智芯 | 解读国产CPU之海光

大家好,我是极智视界,本文分享一下 解读国产CPU之海光。希望我的分享能对你的学习有一点帮助。

极智视界 3319

数据结构—二叉树的4种遍历方式详解以及Java代码的完整演示

本文介绍了4种二叉树的遍历方法,分别是前序、中序、后续、层序遍历,并且每种方法均提供了详尽的Java语言的代码演示,在最后还介绍了遍历结果推导的方法。

终生学习践行者 1万+

【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中)

你是否在全网苦寻【图像去噪(ImageDenoising)】的相关资料?你的目标是否是看懂【图像去噪(ImageDenoising)】的相关论文,复现代码,跑出结果,并试图创新?你是否需要发表【图像去噪(ImageDenoising)】的相关论文毕业?你是否需要做【图像去噪(ImageDenoising)】的相关项目,开发软件,研究算法,获得专利或者软著?只要是与【图像去噪(ImageDenoising)】有关的问题,那么请继续往下看。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

手把手教你学simulink实例--基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

MHD0815的博客 299

数据结构——实验三 二叉树的遍历

一、【实验目的】 1、 了解二叉树的前序、中序、后序和层次序列排列; 2、 将C语言同二叉树的数据结构联系起来; 3、 掌握生成的二叉树的链表结构; 4、 掌握如何按层次输出二叉树的所有结点; 5、 掌握如何将动态二叉树转换为静态二叉链表。 二、【实验内容】 创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:dat...

Zichel77的博客 3785

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【LeetCode算法修炼+动画演示】【二叉树的遍历】——X.遍历二叉树的方法合集、Morris遍历、94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

X.遍历二叉树的方法合集 前中后序遍历的递归实现 代码片段 public static void preOrderRecur(TreeNode head) { if (head == null) { return; } System.out.print(head.value + " "); preOrderRecur(head.left); ...

内脏裂了 5323

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【数据结构】二叉树的三种遍历

遍历二叉树是指按照一定的顺序访问二叉树中的所有节点。常用的三种二叉树遍历方式是前序遍历、中序遍历和后序遍历

javamyfriend的博客 1752

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【开卷数据结构 】二叉树的遍历

二叉树的先序,中序,后续,层序遍历

Ceylan__的博客 1550

数据结构 - 二叉树的遍历

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 二叉树的遍历 N:访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。 给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树。 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。 ...

了解➔熟悉➔掌握➔精通 6万+
上一篇: 【数据结构】堆排序
下一篇: 【数据结构】二叉树的分治
ProcedureStone
博客等级 码龄4年 254粉丝 64原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值