二叉树非递归遍历的一点理解
二叉树是我们必须要了解的一个数据结构,针对这个数据结构我们可以衍生出好多知识。
主要是有几种遍历方式,前序遍历,中序遍历,后续遍历,层次遍历。
下面我们根据这个图来详细的说一下这几种非递归遍历的思想与做法。
只有真正理解了,我们才是真的会了,遇到相似的问题我们就会迎刃而解。
上面的图是我自己画的,以下的几种遍历方式也都是围绕这个图展开的。
所以首先我们先要构建一个上面的图,整体构建的思路有点类似于完全二叉树的构建,如果大家了解堆排序那么理解这个问题其实并不难,对于完全二叉树节点之间会有这样的关系
如果根节点位置为i那么左节点位置为2i+1右节点为2i+2。
如果节点位置为i根节点的位置为(i-1)/2
所以有了这个关系我们不难构建出一个二叉树。
前序遍历的整体思想我们可以这样理解,要遵循这样一个遍历方式就是根左右。先输出根节点,然后左节点,然后右节点。每个节点的遍历都要遵循这种方式,因为栈的特点是先进后出,所以我们保证每次输出的元素都是根节点然后先将右节点压栈,在将左节点压栈,这样每次出栈都是先以左节点为主,符合我们根左右的模式。
中序遍历的整体思想就是左根右的模式,如果二叉树是一颗二叉查找树,那么通过中序遍历输出的结果就是一个有序的结果,因为二叉查找树的定义就是左节点比根节点小,右节点比根节点大,所以我们以左根右的模式输出的话就是有序的。
以下代码的思想是这样我们首先输出的第一个元素肯定是以左节点为主的最后一个叶子节点,所以我们以循环的方式将根节点的左节点一直压栈,然后在出栈,出栈的时候判断一下右节点是否为空,如果为空我们继续出栈,如果不为空将右节点压栈,右节点赋值给当前节点,继续执行之前的步骤即可。
后续遍历的整体思想就是左右根,这里我写了两种方法,第一种是比较有技巧的,我们理解起来也不难,借助了两个栈来实现,下面的图片比较清晰,我们也能比较快速的理解其实就是跟左右方式的逆序,换一句话说就是先序遍历的左右子树反过来,然后在逆序输出就可以了。
这种方式就是我们常规的思路了。以左右根的方式来遍历,所有我们最先输出的一定是左节点,然后是右节点,最后是根节点。
输出的条件就是左子树和右子树都为空,那这个节点就是叶子节点,还有一种不是叶子节点,我们的判断是保留上一次出栈的记录,如果上一次出栈的记录是当前节点的左孩子或者右孩子我们依然出栈,按照这整个思路我们有了以下代码。
层次遍历比较简单,借助队列这种数据结构。
自己测试了一下,这里只展示后续遍历的执行结果。
后续遍历的执行结果。
二叉树非递归遍历的一点理解相关推荐
- 对于二叉树三种非递归遍历方式的理解
利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...
- C++版二叉树非递归遍历
C++版二叉树非递归遍历 文章目录 C++版二叉树非递归遍历 一.二叉树前序遍历 二.二叉树中序遍历 三.二叉树后序遍历 一.二叉树前序遍历 /*** Definition for a binary ...
- 一种二叉树非递归遍历的简单写法
一种二叉树非递归遍历的简单写法 目录 一种二叉树非递归遍历的简单写法 先序遍历 中序遍历 后序遍历 二叉树的遍历是数据结构中非常基础的一个知识点,也是面试手撕代码环节的一个常见题目.这个问题的递归写法 ...
- 二叉树非递归遍历(模版)
读完本篇内容大约花费您7分钟时间 本文主要讲解二叉树非递归遍历,由于是非递归遍历,所以需要用到栈stack,我们如果仔细考虑递归遍历的代码,就能明白非递归种栈的应用. 由于几种遍历方式只是在处理中间节 ...
- 二叉树非递归遍历的经典求解
#include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node {dataty ...
- 二叉树非递归遍历实现(Java)
首先理解一下二叉树节点结构.left指向左节点,right指向右节点,val为节点中的值. class TreeNode {int val;TreeNode left;TreeNode right;p ...
- 数据结构_二叉树非递归遍历
package zz;import java.util.Stack;/*** 二叉树中的二叉搜索树,即一个节点的左子节点关键值小于这个节点,右子节点的关键值大于这个节点* * @author Admi ...
- 更简单的非递归遍历二叉树的方法
解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...
- 二叉树的非递归遍历(c/c++)
由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...
最新文章
- concurrent(六)同步辅助器CyclicBarrier 源码分析
- 项目管理、测试管理、代码bug 管理
- Boost:glob测试程序
- vSphereClient向ESXi主机分配许可证
- nuget包循环引用问题
- 服务器性能监控论文,服务器性能监控系统(本科毕业论文)
- ajax id sort,带有ajax更新的Jqueryui可排序列表
- 558. 四叉树交集
- 写c++好的软件_族谱家谱制作怎么写?专业的家谱族谱编辑制作软件哪个好
- 线性规划单纯形法python实现与代码详细解读
- linux 查询库版本,数据库版本查询(linux数据库版本查询)
- Python模块和包的介绍(模块含义、用模块好处、模块分类、包和模块的创建)
- while it seems to fit format ‘yyyy-MM-dd‘T‘HH:mm:ss.SSSZ‘, parsing fails (leniency? null))
- 百度网页视频倍速播放
- 微信小程序 动态添加view组件
- 无法更改成家庭计算机,怎么都无法设置成功WIN7家庭中两个电脑局域网共享?WIN7家庭 爱问知识人...
- 我们越来越依赖计算机英语作文,过度依赖父母英语作文,人们越来越依赖手机英语作文!...
- 【MATLAB】动画制作
- MDPI期刊的latex模板使用bib快速导入参考文献(TeXstudio)一个更快更简单的方法!
- 计算机卸载应用程序,如何删除或卸载Mac计算机上的应用程序