二叉树前序、中序以及后序遍历(递归展开图)

目录

1.二叉树前置说明

2.前序遍历

2.1函数实现

2.2递归展开图

3.中序遍历

3.1函数实现

3.2递归展开图

4.后序遍历

4.1函数实现

4.2递归展开图


1.二叉树前置说明

在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。因为我们只是为了实现二叉树遍历,所以为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树的排序。

我们创建一个树的结构体,然后实现开辟节点的函数,下面就要链接了(再写一个链接函数,这个函数调用开辟节点函数),开辟好之后就把各自链接起来,大家可以随意链接,我先给大家看看我的树,好方便后面观察递归展开图

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType val;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}TreeNode;//创建一个树的结构体

TreeNode* BuyTreeNode(BTDataType x)//开辟节点
{
	TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return;
	}

	node->val = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

TreeNode* CreateTree()//调用开辟节点函数,然后把节点链接起来就好了
{
	TreeNode* node1 = BuyTreeNode(1);
	TreeNode* node2 = BuyTreeNode(2);
	TreeNode* node3 = BuyTreeNode(3);
	TreeNode* node4 = BuyTreeNode(4);
	TreeNode* node5 = BuyTreeNode(5);
	TreeNode* node6 = BuyTreeNode(6);
	TreeNode* node7 = BuyTreeNode(7);

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

	return node1;
}

int main()
{
	TreeNode* root = CreateTree();

    return 0;
}

2.前序遍历

2.1函数实现

函数的实现很简单(因为前、中、后序的遍历函数可以说没有什么改变,只是顺序不一样),但是光看函数实现肯定不好理解,所以我们重点就在递归展开图,大家写递归的时候就可以画画图,可以更好理解(因为递归是一层一层的)

void PrevOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->val);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

 我们遍历的时候最好把NULL也打印出来,这样可以让我们更好的了解前、中、后序 。

2.2递归展开图

前序遍历是:根  左子树  右子树(访问根结点的操作发生在遍历其左右子树之前)

根据我实现的树,前序遍历是:1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL

具体看递归展开图:

(图片太大,只能截出来两种拼在一起,但是不影响阅读) 大概就是递归进去,然后return或者结束返回,因为递归就是一层一层的

(上面的红字就是对应的相对的解释,我没有把4 5 NULL NULL 6 NULL NULL画出来,因为图片太大展示不出来,但是不用担心,因为后面的和前面的递归方法都差不多) 

3.中序遍历

3.1函数实现

void InOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);
}

3.2递归展开图

中序遍历是:左子树  根  右子树(访问根结点的操作发生在遍历其左右子树之间)

根据我实现的树,前序遍历是:NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL

具体看递归展开图:

4.后序遍历

4.1函数实现

void NextOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	NextOrder(root->left);
	NextOrder(root->right);
	printf("%d ", root->val);
}

4.2递归展开图

后序遍历是:左子树  右子树  根(访问根结点的操作发生在遍历其左右子树之后)

根据我实现的树,前序遍历是:NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1

具体看递归展开图:

到这里递归的遍历就结束了,大家如果实在看不懂,可以边看视频边看展开图,这样可以更好理解解

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

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

相关文章

如何通过信息化为燃气管道提供数据监控、智能的调度和作业技术?

关键词:智慧燃气、燃气监控、智慧管网、智慧燃气管网、智慧燃气管网解决方案、城市燃气管网 在信息化迅猛发展的历史潮流中,如何通过信息化为燃气管道提供更广泛的数据监控、更紧密的数据集成、更智能的调度和作业、更智慧的分析和决策,为安…

干法制程中的辉光放电

在芯片制程中,几乎所有的干法制程,如PVD,CVD,干法刻蚀等,都逃不过辉光放电现象。辉光放电,是一种在低压下电离气体的过程,它在半导体制程中的许多重要步骤中有着核心作用。那您知道什么是“启辉”吗&#x…

UE4/UE5 c++绘制编辑器场景直方图(源码包含场景中的像素获取、菜单添加ToolBar)

UE4/UE5 c场景直方图 UE4/UE5 C绘制编辑器场景直方图绘制原理:元素绘制坐标轴绘制 源码处理 UE4/UE5 C绘制编辑器场景直方图 注:源码包含场景中的像素获取、菜单添加ToolBar 实现效果: 这个是用于美术统计场景中像素元素分布,类…

【100个Cocos实例】编码不规范,接手泪两行...

点击上方亿元程序员关注和★星标。 引言 规范编码,从文件头部注释规范做起。 头部注释规范是一种在代码文件开头添加注释信息的做法,通常用于描述文件的基本信息、作者、创建日期、修改历史等。 这有助于团队成员更好地理解和维护代码。 本文将介绍一…

JVM执行引擎

目录 (一)执行引擎概述 (二)Java代码编译和执行过程 (三)机器码,指令,汇编语言,字节码 1、机器码 2、指令 3、指令集 4、汇编 5、字节码 (四&#x…

一、Oceanbase基础

一、集群相关概念 集群:整个分布式数据库。Region:表示区域,是地域的逻辑概念,如1个城市,1个集群可以有多个Region,用于跨城市远 距离容灾。Zone:表示分区,是机房或机架的逻辑概念…

深度学习【二】

1.运行时错误 1.1 ModuleNotFoundError: No module named ‘torch_scatter’ 参考 https://blog.csdn.net/weixin_42421914/article/details/132875571 pip install --no-index torch-scatter -f https://pytorch-geometric.com/whl/torch-1.13.1%2Bcpu.html

某思路等考通一级MSOffice的分析

看到有朋友寻求2021版的等级考试一级软件,秉承授人以鱼不如授人以渔的理念,特写这个帖子。 某思路等考通一级MSOffice,版本6.5。 用到的软件,ScanId,de4dot,dnSpy。 第一步:分析 软件启动后有在线激活提示&…

华为云CDN刷新与查询余量的Go实现及在Jenkins中的部署

引言 在华为云上,对CDN缓存内容进行刷新是一个常见的需求,以确保最新的内容能尽快被用户访问到。通过使用Go语言,我们可以开发一个自动化的工具来实现这一需求,并将其集成到Jenkins中以实现持续部署。下面我们将分步骤讲解如何实…

MySQL递归查询:洞悉数据的层层关联

在处理关系型数据库时,我们经常会遇到这样的情况:某些数据之间存在层级关系,例如目录、组织结构、评论等。在这些场景下,我们需要一种灵活的查询技术来处理这种层级关系。今天我们就来探讨MySQL中的递归查询,体验其独特…

ThinkPHP6学生选课管理系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6学生选课管理系统 一 介绍 此学生选课管理系统基于ThinkPHP6框架开发,数据库mysql8,前端bootstrap。系统角色分为学生,教师和管理员。学生登录后可进行选课,教师登录后可查看选课情况…

Android : 获取、添加、手机联系人-ContentResolver简单应用

示例图: MainActivity.java package com.example.mygetdata;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Mani…

图书管理系统源码,图书管理系统开发,图书借阅系统源码四TuShuManager应用程序MVC视图View

Asp.net web应用程序MVC之View视图 .ASP.NET MVC页面也就是要说的视图基本被放在Views文件夹下; 2.利用APS.NET MVC模板生成框架,Views文件夹下的默认页面为.cshtml页面; 3.ASP.NET MVC默认页面为Razor格式的页面,因此默认页面为.…

三、Lua变量

文章目录 一、变量分类二、变量赋值三、索引 一、变量分类 lua变量分为全局变量,局部变量。 全局变量:默认,全局有效。 局部变量:从作用范围开始到作用范围结束,需加local 修饰。 a1function ff()local b1 endprint(a…

spring boot的redis连接数过多导致redis服务器压力过大的一次问题排查

一、背景 在今天上午的时候,突然收到大量的sentry报错,都是关于redis连接超时的警告。 首先想到的是去查看redis的监控,发现那个时间段,redis的请求数剧增,cpu使用率和带宽都陡增双倍。 下面的是redis监控的cpu情况 …

Module build failed: Error: ENOENT: no such file or directory

前言 这个错误通常发生在Node.js 和 vue,js项目中,当你试图访问一个不存在的文件或目录时。在大多数情况下,这是因为你的代码试图打开一个不存在的文件,或者你的构建系统(例如Webpack)需要一个配置文件,但找…

程序员为什么要一直坚持写博客

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 今天的文章其实说和技术有关系也没有什么问题,算起来我日更文章已经快四个月了,从最初的…

四、Lua循环

文章目录 一、while(循环条件)二、for(一)数值for(二)泛型for(三)repeat util 既然同为编程语言,那么控制逻辑里的循环就不能缺少,它可以帮助我们实现有规律的重复操作,而…

洗地机应该怎么选?希亦、必胜、米博、添可、小米洗地机实测推荐

作为一个常年测评智能家居的博主,关于洗地机的测评使用这些年也积累了不少的体验感受。以至于常被周边的朋友问到,洗地机到底是不是真的好用?洗地机有什么优点吗?选购的时候应该怎么选呢?洗地机什么牌子比较好呢&#…