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

news/2024/7/20 20:15:42 标签: 深度优先, 算法, 广度优先, 栈/队列

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !

14天阅读挑战赛

文章目录


二叉树遍历原理

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

深度优先遍历:

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

广度优先遍历

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

在这里插入图片描述

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

流程: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.niftyadmin.cn/n/349.html

相关文章

git 远程分支与本地分支

前言 远程仓库上只有 1 个 master 分支。 复制远程仓库的地址。 3. 克隆远程仓库到本地。 一、 注意:本地的 head 和 master 文件都存在,但是 remote 的 master 信息是保存在文件 .git/packed-refs 中。 可以看到,当前 HEAD 指针指向本地仓…

驱动进化之路:设备树的引入及简明教程

驱动进化之路:设备树的引入及简明教程 设备树的基本概念和产生背景 问题1: 以LED为例,当要更换LED所用的GPIO引脚时,需要修改驱动程序源码,重新编译驱动,重新加载驱动。 问题2: 由于芯片种类繁…

Spring项目的创建和使用-----实现代码解耦和自动化(直接用bean)

1.Spring框架的发展史 1)最早的Spring项目:2018年的老框架Spring框架,基于maven项目,这种Spring运行方式没有比Servlet有很大的优势(不明显),是需要用到Tomact来进行运行,也是需要到官方找jar包,引入依赖到pom.xml里面…

[做初中数学题做到打起来了]跟同事为了他小孩的数学题杠上了

目录1.前情提要2.蒙特卡洛方法3.尾声1.前情提要 这是2019年 NGA 论坛上的一个帖子: 帖子中提出了一个问题:4只小鸭子在一个大的圆形水池中,分别随机的出现在圆圈中的任意一点。4只鸭子出现在同一个半圆内的概率是多少? 这个问题当时分歧很大…

“购物返现积分兑换”——区块链思维的购物返利方式

商业运营模式只是一个让商家提高销售额的一种手段,不管线上还是线下都是一样的。 例如:买二送一、转介绍购优惠、新人促销价这些,这都是非常普遍的的营销商业运营模式,大部分每一个线下推广实体线店家都有用,这也是线…

第十三届蓝桥杯Java、C++、Python组国赛真题——最大公约数(三语言AC)

目录1.最大公约数1.问题描述2.输入格式2.输出格式3.样例输入4.样例输出5.数据范围6.原题连接2.解题思路3.Ac_codeCJavaPthon1.最大公约数 1.问题描述 给定一个数组, 每次操作可以选择数组中任意两个相邻的元素 x,yx, yx,y 并将其 中的一个元素替换为 gcd⁡(x,y)\operatorname…

Python零基础—网络爬虫入门,附学习路线+笔记+视频教程

这是本文的目录前言学习目标所需技能与Python版本所需技术能力选择Python的原因选择Python3.x的原因初识网络爬虫网络爬虫的概念1. 通用网络爬虫2. 聚焦网络爬虫3. 增量式网络爬虫4. 深层网络爬虫网络爬虫的应用Robots协议搜索引擎核心零基础Python学习资源介绍👉Py…

gcc环境下演示C语言变长数组

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…