二叉树和堆(3)——二叉树链式结构的实现和递归思想(1)

目录

二叉树的前序、中序和后序遍历

前序遍历

图片解析

代码表示

递归分析

中序遍历

图片解析

代码表示

后序遍历

图片解析

代码表示


学习二叉树的基本操作前,需要创建一棵二叉树,然后才能学习相关的操作。因此,本篇我们就先介绍一下二叉树的链式结构。这里的链式结构说的是二叉树的前序、中序和后序遍历。

二叉树的前序、中序和后序遍历

学习二叉树的结构,最简单的就是遍历。所谓二叉树的遍历,就是按照某种特殊的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。

前序遍历

前序遍历:先访问根节点,然后是左子树,最后是右子树。每个子树也是这样的顺序进行遍历。

注意,这里说的是子树,而不是孩子

图片解析

图中ln和rn分别代表左子树和右子树,并且用ln和rn表述的子树都是空。为了能够清楚原理,我们把空的子树也表是出来。

从图上看,前序遍历就是类似于一个递归,遍历完 1 后,就开始遍历 1的 左子树,1的左子树里的其他按照 根 左子树 右子树遍历后,遍历 1 的右子树,原理同上。

代码表示

我们先手捏一个符合图上的二叉树。

代码如下:

typedef int datatype;
typedef struct BinaryTree
{
	datatype _data;
	struct BinaryTree* _left;
	struct BinaryTree* _right;
}BT;

BT* CreatNode(datatype x)
{
	BT* newnode = (BT*)malloc(sizeof(BT));
	if (newnode == NULL)
	{
		perror("malloc");
		return;
	}
	newnode->_left = NULL;
	newnode->_right = NULL;
	newnode->_data = x;
	return newnode;
}
BT* CreatBinaryTree()
{
	BT* node1 = CreatNode(1);
	BT* node2 = CreatNode(2);
	BT* node3 = CreatNode(3);
	BT* node4 = CreatNode(4);
	BT* node5 = CreatNode(5);
	BT* node6 = CreatNode(6);
	node1->_left = node2;
	node1->_right = node4;
	node2->_left = node3;
	node4->_left = node5;
	node4->_right = node6;
	return node1;
}

然后前序遍历:

void PreOrder(BT* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->_data);
	PreOrder(root->_left);
	PreOrder(root->_right);
}
int main()
{
	BT* root = CreatBinaryTree();
	PreOrder(root);
	return 0;
}

我们打印一下:

为什么是这样呢?

递归分析

就是一个简单的函数递归,先执行红色箭头的,在执行绿色箭头的,最后在执行紫色箭头的。

也就是 打印 1 后 ,进入 1的_left ,然后 打印 2 然后进入 2的_left , 打印 3然后 进入3的_left ,打印 n 后返回上级函数(即3),然后进入 3的_right ,打印 n然后返回3 ,此时 3 的函数已经结束,然后返回 2的_left,然后进入 2的_left ,然后打印 n后返回2 此时2已经结束,就返回 1的_left 然后进入1的_right,然后打印 4 后 ,进入4的_left ,然后打印 5 .。这样依次类推。

中序遍历

中序遍历:先访问左子树,然后访问根,然后访问右子树。

图片解析

有了前面前序遍历的铺垫,中序遍历是不是很简单了。

代码表示

中序遍历的代码如下:

void InOrder(BT* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	InOrder(root->_left);
	printf("%d ", root->_data);
	InOrder(root->_right);
}

我们打印一下试试:

和我们上面的图片分析的一样捏。

这个递归分析和前序遍历的一样,这里就不展开说了。

不懂的小伙伴可以画一下递归图呀。

后序遍历

后序遍历:先遍历左子树,然后遍历右子树,最后遍历根。

图片解析

相信这个已经难不倒小伙伴们了

代码表示

后序遍历的代码如下:

void PostOrder(BT* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	PostOrder(root->_left);
	PostOrder(root->_right);
	printf("%d ", root->_data);
}

我们打印一下试试:

完全一样。

今天就到这里啦,拜拜。明天还是更新二叉树,明天更加好玩。

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

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

相关文章

我在代码随想录|写代码Day25 |回溯算法|93.复原IP地址 , 78.子集 , 90.子集II

学习目标: 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 👍👍👍👍👍👍👍👍👍👍👍👍 ☆*: .。. o(≧▽≦)…

200行C++代码写一个网络调试助手(TCP服务端TCP客户端)

前言 今天分享一个200行C代码写成的QT网络调试助手。 可以先看看效果 。 因为我不喜欢用QT Designer,因此我用的组件都是使用代码布局的,所以需要设计一下布局。 界面是参考的之前写的串口助手,就是把里面的逻辑改了改,因此外观…

HACKTHEBOX通关笔记——Cronos(退役)

开启环境,调试网络确保互联互通 拿到IP之后还是先来做一下端口扫描,nmap --rate-min5000 -p- -v ip,也可以加个-Pn做下禁ping扫描,当然这个速率很快,实际攻防时候加了pn参数也是容易被发现的,所以对抗时候…

TypeScript实战系列之强力爆破泛型的困扰

目录 介绍开始如何理解泛型语法泛型约束泛型默认值练习后续 介绍 泛型在typescript 中使用频率相当高,也给了初学者相当大的阻碍。希望这一篇文章,能帮助你们爆破它。 开始 下面通过模拟实现一个简易版本的axios来引入泛型的使用 // axios.ts type M…

【面试】冲刺春招!每天三十道面试题——Java基础篇(一)

目录 一 JDK 和 JRE 的区分 二 简述编码的作用以及记事本的实现原理 三 基本类型有哪些?分别占据多少空间? 四 java中布尔类型的空间大小是怎么定下来的?为什么不是1bit, 把考虑因素说一下 五 int类型和float类型哪一个精度更…

算法学习——华为机考题库5(HJ31 - HJ35)

算法学习——华为机考题库5(HJ31 - HJ35) HJ31 单词倒排 描述 对字符串中的所有单词进行倒排。 说明: 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单…

使用yolov5时需要安装的requirements.txt

之前需要配置好pytorch,同时注意的是pytoorch版本需要在1.7以上 1.github下载好requirements.txt 文件内容如下: 2.在cmd命令行转移到yolov5所在文件夹及配置的yolo环境中,直接下载 pip install -r requirements.txt -i http://pypi.doub…

ElementUI Form:Form表单

ElementUI安装与使用指南 Form表单 点击下载learnelementuispringboot项目源码 效果图 el-form.vue&#xff08;Form表单&#xff09;页面效果图 项目里 el-form.vue代码 <script> export default {name: el_form,data() {var checkAge (rule, value, callback…

计算机速成课Crash Course - 28. 计算机网络

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 28. 计算机网络 (qq.com) 28. 计算机网络 互联网太棒啦&#xff0c;键…

uptrained的解释

问题来源 language model checkpoints with multihead attention (MHA) can be uptrained (Komatsuzaki et al., 2022) to use MQA with a small fraction of original training compute 而翻译词典无法翻译 解释&#xff1a; “uptrained” 这个词没有直接的中文翻译&…

k8s学习-Kubernetes的包管理器Helm

1.1 为何需要Helm Kubernetes能够很好地组织和编排容器&#xff0c;但它缺少⼀个更高层次的应用打包工具&#xff0c;而Helm就是来干这件事的。 先来看个例子。 比如对于⼀个MySQL服务&#xff0c;Kubernetes需要部署下面这些对象&#xff1a; &#xff08;1&#xff09;Serv…

【遥感入门系列】遥感电磁辐射与遥感过程

遥感电磁辐射是比较难理解也是非常重要的内容&#xff0c;对于一般学习遥感专业的人来说&#xff0c;只需要学习个大概&#xff0c;这个大概主要包括你需要理解几个概念以及能从电磁辐射原理上解释一些遥感现象&#xff0c;进而为遥感过程的理解打下一个基础&#xff0c;如果你…

揭秘备忘录模式:打造灵活高效的状态管理解决方案

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。这种模式主要用于实现撤销操作。 在 Java 中&#xff0c;备忘录模式通常包括以下三个角色&#xff1a; 发起人&#xff08;O…

使用Java实现基于HTTP的分布式系统:让你的应用“四处开花”

在数字世界里&#xff0c;分布式系统就像是一个大家庭&#xff0c;每个成员&#xff08;即节点&#xff09;都有自己的任务和职责&#xff0c;共同维护整个家庭的运转。如果你想使用Java来实现这样一个大家庭&#xff0c;让应用在各个节点上“四处开花”&#xff0c;那就需要借…

设计模式1-访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许你定义在对象结构中的元素上进行操作的新操作&#xff0c;而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开&#xff0c;使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…

css1文本属性

一.颜色&#xff08;color&#xff09;&#xff08;一般用16进制&#xff09; 二.对齐&#xff08;text-align) 三.装饰&#xff08;text-decoration&#xff09; 四.缩进&#xff08;text-indent&#xff09;&#xff08;一般用2em&#xff09;&#xff08;有单位&#xff09;…

面试数据结构与算法总结分类+leetcode目录【基础版】

&#x1f9e1;&#x1f9e1;&#x1f9e1;算法题目总结&#xff1a; 这里为大家总结数据结构与算法的题库目录&#xff0c;如果已经解释过的题目会标注链接更新&#xff0c;方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的&#xff0c;同时这也是面试…

idea中找到所有的TODO

idea中找到所有的TODO &#xff08;1&#xff09;快捷键 Alt6 &#xff08;2&#xff09;View -> Tool Windows -> TODO

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

正则表达式可视化工具regex-vis

什么是正则表达式 &#xff1f; 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个“规则字符串”用来表达对字符串的一种过滤逻辑。【百度百科】 正则表达式用简短…