【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

2023-09-21 22:04:09

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

一、二叉树的深度优先遍历

🌺1.前序遍历

(1)先序遍历的过程:

1.先访问当前节点(即根节点)

2.遍历当前节点的左节点,再同样遍历左子树中的节点

3.遍历完当前节点的左子树后,再去遍历当前节点的右子树,再遍历右子树中的节点

总结先访问根节点,然后遍历左子树,最后遍历右子树;即根左右

(2)流程图:

在这里插入图片描述

(3)代码:

// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", root->_data);
	BinaryTreePrevOrder(root->_left);
	BinaryTreePrevOrder(root->_right);
}

(4)测试结果:

1->2->3->NULL->NULL->NULL->4->5->NULL->NULL->6->NULL->NULL

在这里插入图片描述

🌼2.中序遍历

(1)中序遍历的过程:

1.先进入当前节点的左子树,以同样的步骤遍历左子树的节点

2.访问当前节点

3.最后进入到当前节点的右子树,以同样的步骤遍历右子树中的节点

总结先遍历左子树,再访问根节点,最后遍历右子树,即 左根右

(2)代码:


// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	BinaryTreePrevOrder(root->_left);
	printf("%d ", root->_data);
	BinaryTreePrevOrder(root->_right);
}

(3)测试结果:

NULL->3->NULL->2->NULL->1->NULL->5->4->NULL->6->NULL

在这里插入图片描述

🌻3.后序遍历

(1) 后序遍历的过程:

1.先进入当前节点的左子树,以同样的步骤遍历左子树中的节点

2.再进入当前节点的右子树,以同样的步骤去遍历右子树中的节点

3.最后遍历此左子树和右子树的父亲节点,也就是该节点

总结先遍历左子树,再遍历右子树,最后访问根节点,即左右根

(2)代码:

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	BinaryTreePrevOrder(root->_left);
	BinaryTreePrevOrder(root->_right);
	printf("%d ", root->_data);
}

(3)测试结果:

NULL->NULL->3->NULL->2->NULL->NULL->5->NULL->NULL->6->4->1
在这里插入图片描述

二、【广度优先】层序遍历

1.思路及过程:

构建一颗二叉树
在这里插入图片描述
1.将root节点1放入队列。
在这里插入图片描述
2.取队列首元素1,并将节点1左右孩子入队
在这里插入图片描述
3.队首元素出队列
在这里插入图片描述
4.取队列首元素2,并将节点2左右孩子入队,由于只有左孩子,所以只用入队一个元素。
在这里插入图片描述
5.队首元素出队列
在这里插入图片描述
6.取队列首元素4,并将节点4左右孩子入队。
在这里插入图片描述
7.队首元素出队列
在这里插入图片描述
8.取队列首元素3,并将节点3左右孩子入队。但是,元素3左右孩子为NULL,因此不用入队。直接执行出队列操作。
在这里插入图片描述
9.取队列首元素5,并将节点5左右孩子入队。但是,元素5左右孩子为NULL,因此不用入队。直接执行出队列操作.
在这里插入图片描述

10.取队列首元素6,并将节点6左右孩子入队。但是,元素6左右孩子为NULL,因此不用入队。直接执行出队列操作。
在这里插入图片描述
11.到此,队列元素已全部出队,层序遍历完成!
结果为:
在这里插入图片描述

2.代码

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
	Que q;
	QueueInit(&q);

	if (root)
		QueuePush(&q,root);
	while (!QueueEmpty(&q))
	{
		BTNode* tmp = QueueFront(&q);
		printf("%d ", tmp->_data);
		if (tmp->_left)
		{
			QueuePush(&q,tmp->_left);
		}
		if (tmp->_right)
		{
			QueuePush(&q, tmp->_right);
		}
		QueuePop(&q);
	}
	printf("\n");
	QueueDestroy(&q);
}

3.测试结果

在这里插入图片描述

更多推荐

外汇天眼:英国FCA引入新规定,强化金融广告审核标准!

英国金融行为监管局(FCA)为帮助人们做出明智的储蓄、投资和借贷决策,将引入新的筛选检查措施,针对那些批准金融广告的公司。批准非受监管公司的金融营销的公司必须证明他们具备批准广告所需的技能和专业知识。那些签署广告批准的人必须了解产品,以确保广告的宣传准确,并合理平衡风险和回报。以前,受FCA授权的任何公司都可以代表不受

Java 21 发布,新功能助力开发更高效

Java21是JavaSE平台的最新长期支持(LTS)版本,于2023年9月19日发布。它包括了一系列新功能和改进,可以让开发人员编写更高效、更可靠、更安全的Java应用程序。新功能亮点Java21的新功能包括:虚拟线程:虚拟线程是一种新的并发模型,可以使开发人员编写更高效的并发代码,而无需担心线程调度和同步的复杂性。

IP转地理位置:探讨技术与应用

IP地址是互联网上设备的唯一标识符,而将IP地址转换为地理位置信息是网络管理、安全监控和市场定位等领域中的一项重要任务。本文将深入探讨IP转地理位置的技术原理和各种应用场景。IP地址与地理位置IP地址(InternetProtocolAddress)是一组数字,用于唯一标识互联网上的设备。它们分为IPv4(32位地址)

深入了解Java的核心库

掌握Java的核心库是成为一名优秀的Java开发者的关键。Java提供了丰富的核心库和API,包括集合框架、输入输出、多线程、异常处理等等。熟悉并掌握这些库的使用,可以提高编程效率和代码质量。在本文中,我们将深入讨论Java的核心库,并提供一些代码示例来帮助读者更好地理解和掌握这些库。1.集合框架:Java的集合框架提

LeetCode算法动态规划—斐波那契数列

目录剑指Offer10-I.斐波那契数列-力扣(LeetCode)题解:代码:运行结果:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项(即F(N))。斐波那契数列的定义如下:F(0)=0,F(1)=1F(N)=F(N-1)+F(N-2),其中N>1.斐波那契数列由0和1开始,之后的斐波那契数就是由之前

机器学习(18)---朴素贝叶斯

朴素贝叶斯一、概述1.1概率分类器1.2贝叶斯工作原理1.3贝叶斯的性质二、sklearn中的朴素贝叶斯2.1贝叶斯分类器2.2高斯朴素贝叶斯GaussianNB2.3探索贝叶斯:高斯朴素贝叶斯擅长的数据集2.4探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度一、概述1.1概率分类器1.在许多分类算法应用中,特征和标签之

LeetCode LCR 103. 零钱兑换【完全背包,恰好装满背包的最小问题】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

Springboot 实践(17)spring boot整合Nacos配置中心

前文我们讲解了Nacos服务端的下载安装,本文我们降价springboot整合nacos,实现Nacos服务器配置参数的访问。一、启动Nacos服务,创建三个配置文件,如下所示Springboot-Nacos-Client-dev.yaml文件配置参数Springboot-Nacos-Client.yaml文件配置参数

个人博客网站一揽子:Docker搭建图床(Lsky Pro)

LskyPro介绍LskyPro是一个用于在线上传、管理图片的图床程序,中文名:兰空图床,你可以将它作为自己的云上相册,亦可以当作你的写作贴图库。兰空图床始于2017年10月,最早的版本由ThinkPHP5开发,后又经历了数个版本的迭代,在2021年末启动了新的重写计划并于2022年3月份发布全新的2.0版本。特性支持

主干网络篇 | YOLOv8 更换主干网络之 VanillaNet |《华为方舟实验室最新成果》

论文地址:https://arxiv.org/pdf/2305.12972.pdf代码地址:https://github.com/huawei-noah/VanillaNet在基础模型的核心是“多样性即不同”,这一哲学在计算机视觉和自然语言处理方面取得了惊人的成功。然而,优化和Transformer模型固有的复杂性带来

爬虫 — App 爬虫(二)

目录一、Appium介绍二、node.js安装三、Java的SDK安装以及配置1、安装步骤2、配置环境变量四、安卓环境的配置1、配置环境变量五、Appium安装1、安装2、打开APP3、使用六、Appium使用1、定位数据(方法一,不常用)2、定位数据(方法二,常用)3、练习4、界面滑动七、案例一、Appium介绍类似

热文推荐