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

简介: 二叉树遍历原理

二叉树遍历原理


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

深度优先遍历:

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

广度优先遍历

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

414226edf21649dc9ddff09daad014ad.png

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

流程: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出栈


7f7d96779efd48ebaf18c640d5de873e.png

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

流程: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,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止




目录
相关文章
|
3天前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
32 9
 算法系列之数据结构-二叉树
|
14天前
|
NoSQL 算法 安全
Redis原理—1.Redis数据结构
本文介绍了Redis 的主要数据结构及应用。
Redis原理—1.Redis数据结构
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
158 77
|
7天前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
17 4
|
20天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
2月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
60 12
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
58 10
|
4月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
381 9
|
4月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
64 1
|
2月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
52 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】