二叉树遍历原理 | 深度优先-广度优先 | 栈-队列

news2024/11/20 9:48:54

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !

14天阅读挑战赛

文章目录

    • 二叉树遍历原理
    • 队列和栈区别
    • 深度优先遍历(DFS)
      • 前序遍历(根-左-右)
      • 中序遍历(左-根-右)
      • 后序遍历(左-右-根)
    • 广度优先遍历(BFS)
      • 逐层遍历(上-下 | 左-右)
    • 深度优先遍历 / 广度优先遍历区别


二叉树遍历原理

二叉树遍历分为深度优先遍历和广度优先遍历

深度优先遍历:

  • 利用递归和栈的数据结构,完成深度优先遍历

广度优先遍历

  • 利用队列的先进先出的策略,完成广度优先遍历

在这里插入图片描述

  • 前序遍历:根节点——左子树——右子树
  • 是否输出取决于是否符合前序遍历规则(根—左—右)

流程:4-2-1-3-6-5-7

原理:

  • 访问根节点4,所以4入栈,输出4;遍历2,2压栈,输出2;遍历1,1压栈,输出1;1左右结点为空,所以1出栈,回到2,遍历2右结点3,3压栈,输出3;遍历3,3压栈;3的左右结点为空,所以3出栈,返回2;2的左右结点遍历过了,所以2出栈,返回4;4的左节点遍历过了,接着遍历4的右结点;遍历6,6压栈,输出6;遍历5,5压栈,输出5;因为5左右结点为空,所以5出栈,返回6;遍历7,7压栈,输出7;7左右结点为空、且6遍历过了,所以7、6依次出栈;整个访问结点都以完成,所以4出栈

中序遍历:先访问左子树——根节点——右子树,按照这个顺序

  • 是否输出取决于是否符合中序遍历规则(左—根—右)

流程:1-2-3-4-5-6-7

原理:

  • 访问根结点4,所以4入栈,因为此处是中序遍历需要符合(左—根—右)规则,所以不输出4;接着遍历左节点2,2压栈,此处2为根结点也不符合(左—根—右)所以不输出;遍历1,1压栈,输出1;1没有左右结点,1出栈,回到根节点2,输出2;遍历2的右节点3,3入栈,输出3;3左右结点为空,3出栈,回到2,2左右结点已遍历,2出栈,回到4,输出4;遍历4右结点,6入栈;遍历5,5压栈,输出5,5的左右结点为空,5出栈,回到6,且输出6;遍历7,7入栈,输出7;7没有左右结点,7出栈,回到6;7、6、4都已遍历,依次出栈
  • 后序遍历:和前面差不多,先访问树的左子树——右子树——根节点
  • 是否输出取决于是否符合后序遍历规则(左—右—根)

流程:1-3-2-5-7-6-4

原理:

  • 访问根结点4,所以4压栈;访问左节点,2入栈;访问左结点,1入栈,输出1;1左右结点为空,1出栈,回到2结点,此时2结点不能输出,需要符合后序遍历规则(左—右—根);遍历3,3入栈,输出3;3的左右结点为空,所以3出栈,回到2,输出2;2的子结点已遍历,2出栈,回到4;遍历4的右结点,遍历6,6入栈;访问6的左节点5,5压栈,输出5;5没有子结点,所以5出栈,回到6;遍历6的右子结点,遍历6,7入栈,输出7;7没有子结点,7出栈,回到6,输出6;结点6的左右结点已遍历,6出栈,回到4,输出4,4出栈

在这里插入图片描述

  • 逐层遍历:把一棵树从上到下,从左到右依次写出来
  • 是否输出取决于是否符合后序遍历队列规则(先进先出)(根—左—右)

流程:4-2-6-1-3-5-7

原理:

  • 根节点入队列,4进入队列,4出队列,输出4;遍历4的左结点2入队列,4的右结点6入队列;2出队列,输出2;2出队列后,需要对2的左右结点1和3分别入队列;6出队列,输出6;6出队列后,需要对6的左右结点5和7分别入队列;此时树中无左右结点,而队列中,从下至上依次为:1/3/5/6;依次从下至上出队列,输出1/3/5/6

队列和栈区别

  • 队列:先进先出(First In First Out)FIFO

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列

  • 栈:先进后出(First In Last Out )FILO

    栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素

深度优先遍历(DFS)

前序遍历(根-左-右)

前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树

中序遍历(左-根-右)

中序遍历是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树

后序遍历(左-右-根)

后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历、后序周游,可记做左右根。后序遍历有递归算法和非递归算法两种。在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点

广度优先遍历(BFS)

逐层遍历(上-下 | 左-右)

层次遍历 ,就是指从二叉树的第一层(根节点)开始,从上至下逐层遍历,在同一层中,则按照从左到右的顺序对节点逐个访问。在逐层遍历过程中,按从顶层到底层的次序访问树中元素,在同一层中,从左到右进行访问

深度优先遍历 / 广度优先遍历区别

  • 深度优先遍历

    深度优先搜索别名又叫DFS,属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次

  • 广度优先遍历

    广度优先搜索别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止


🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝冲冲冲🤞


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件研发人效提升之道,法,术,器,势

在华为的寒气传递之前,笔者已经在思考和实战如何提高研发人效。目的目标很明确: 提高软件研发人效,所谓的软件人效,简单粗暴的定义就是以最低单位人均成本,快速,高质量,高频率,安全地交付软件产…

C++笔记之bitset使用

C++笔记之bitset使用 文章目录 C++笔记之bitset使用0.进制介绍1.cppreference2.常规使用3.用法总结3.1.bitset是什么3.2.使用方法3.3.相关使用函数3.4.转换函数0.进制介绍 1.cppreference

C语言高级教程-C语言数组(五):二维(多维)数组初始化和基于数组的综合实例->帽子选购问题

C语言高级教程-C语言数组(五):二维(多维)数组初始化和基于数组的综合实例->帽子选购问题一、本文的编译环境二、二维数组的初始化三、三维数组的初始化四、使用for循环求三维数组元素值的和4.1、for循环求数组元素值…

行业周期分析的主要内容,怎么分析行业生命周期

如何分析经济周期? 很多人认为经济周期分析很难,很复杂。但是作为一个投资者,必须了解一定的经济周期分析原理。所以今天康少就用一张图来简单讲解下经济周期的分析。 一、经济周期判断1、经济趋向繁荣:普通股收益将大幅提高&am…

第07篇:巧用Spring类型转换, ConverterFormatter知识点学习。

公众号: 西魏陶渊明 CSDN: https://springlearn.blog.csdn.net 天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄! 文章目录一、前言1.1 类型转换1.2 格式化输出二、Converter 类型转换2.1 Converter2.1.1 接口定义2.1.2 接口功能2.2 ConverterFactory2.2.1 接口定义…

java8特性,lambda表达式,简写的演变及应用

🍬博主介绍 👨‍🎓 博主主页:chad_chang的主页 ✨主攻领域:【大数据】【java】【python】【面试分析】 文章目录lambda表达式1.1.简介1.1.1.什么是Lambda?1.1.2.为什么使用Lambda1.1.3.Lambda对接口的要求1…

【Linux】特别篇--SMBus 协议

【Linux】特别篇--SMBus 协议一、SMBus 简介二、SMBus 与 I2C 区别三、SMBus协议分析3.1 符号含义3.2 SMBus Quick Command3.3 SMBus Receive Byte3.4 SMBus Send Byte3.5 SMBus Read Byte3.6 SMBus Read Word3.7 SMBus Write Byte3.8 SMBus Write Word3.9 SMBus Block Read3.1…

672页21万字智慧高速数据中心大数据平台建设方案

目 录 第1章 设计总述 6 1.1 项目概述 6 1.1.1 项目名称 6 1.1.2 建设单位概况 6 1.1.3 公司具备的优势 6 1.2 对项目的理解分析 7 1.2.1 项目现状分析 7 1.2.2 建设目标分析 10 1.2.3 建设内容分析 13 1.2.4 项目建设重难点分析 19 1.2.5 项目风险分析 22 1.2.6 各中心职能需求…

python控制台颜色输出设置

python控制台颜色输出设置 控制台输出内容的颜色有前景色与背景色 控制台的展示效果有限,并不能像前端一样炫酷,只能做一些简单的设置 原理 python终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无…

【C++笔试强训】第十天

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 💦 &…

操作系统的地址、数据存储和大小端问题

文章目录基本概念什么是位,什么是字节?地址总线内存地址物理地址虚拟地址寻址空间存储单元CPU位数CPU寻址大端存储和小端存储原理为什么会有大小端模式的区分基本概念 什么是位,什么是字节? 位表示的是二进制位,一般…

C语言中用sizeof和strlen观察数组的变化2

目录 一.前言 二.用sizeof观察字符串数组的变化 代码 运行结果 结果解释 图解 三.用sizeof观察字符数组的变化 代码 注意 运行结果 图解 注意 证明 一.前言 数组名大部分情况下是首元素的地址,只有两种情况除外: sizeof(数组名&…

哈希桶的基本操作 || HashMap和HashSet介绍(手撕源码)

目录 前言: 哈希表介绍 哈希冲突 闭散列 开散列(哈希桶) 模拟实现哈希桶中插入和获取方法 代码实现 HashMap介绍 手撕源码 HashSet介绍 手撕源码 小结: 前言: 🎈一棵搜索树的最快查找数据的时间复杂度是O(…

Java------String类和正则表达式

String在设计时被定义成了final类(最终类),所以不能定义String类的子类,String用来表示字符串常量,是引用数据类型,一旦String类对象的字符序列被定义,那么这个字符序列的值是不能再变化的。 创…

今年十八,喜欢SQL注入

#1024程序员节|用代码,改变世界# 前言 🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 🍁个人主页:被吉师散养的职业混子 🫒每日emo:怀揣…

牛客竞赛每日俩题 - Day5

DP贪心 年终奖_牛客题霸_牛客网 思路: 定义f(i,j)表示从左上角走到坐标(i,j)处能获得的最大奖励。 搜索所有从左上角走到右下角的路径,找到最优路径。 f(i,j)分三种情况: 第一列:f(i, 0) f(i-1, 0) board(i, 0) 如果…

Java:企业应该用Java构建供应链软件吗?

很多公司使用Java编程语言,Java是最流行的编程语言之一,它帮助开发人员简化复杂企业解决方案的应用程序开发过程。 供应链是零售和制造业的重要组成部分,6%的零售业公司使用Java,另一方面,4%的制造公司使用编程语言&am…

基于莱维飞行扰动策略的麻雀搜索算法-附代码

基于莱维飞行扰动策略的麻雀搜索算法 文章目录基于莱维飞行扰动策略的麻雀搜索算法1.麻雀优化算法2. 改进麻雀算法2.1 莱维飞行搜索机制2.2 莱维飞行扰动策略2.3 初始化混沌搜索机制3.实验结果4.参考文献5.Matlab代码6.Python代码摘要:为了解决麻雀搜索算法存在迭代…

(02)Cartographer源码无死角解析-(04) 熟悉bag文件,配置.launch与.lua文件,初步调参

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

算法 | 详解斐波那契数列问题

14天阅读挑战赛 本篇是学习了《趣学算法(第2版)》 第一章之后总结的。 上一篇讲到了等比数列求和问题,求Sn122223...263?S_n 1 2 2^2 2^3 ... 2^{63} ?Sn​122223...263?,该函数属于爆…