二叉树非递归遍历的一点理解

10 篇文章 0 订阅

二叉树是我们必须要了解的一个数据结构,针对这个数据结构我们可以衍生出好多知识。
主要是有几种遍历方式,前序遍历,中序遍历,后续遍历,层次遍历。
下面我们根据这个图来详细的说一下这几种非递归遍历的思想与做法。
只有真正理解了,我们才是真的会了,遇到相似的问题我们就会迎刃而解。
在这里插入图片描述
上面的图是我自己画的,以下的几种遍历方式也都是围绕这个图展开的。
所以首先我们先要构建一个上面的图,整体构建的思路有点类似于完全二叉树的构建,如果大家了解堆排序那么理解这个问题其实并不难,对于完全二叉树节点之间会有这样的关系
如果根节点位置为i那么左节点位置为2i+1右节点为2i+2。
如果节点位置为i根节点的位置为(i-1)/2
所以有了这个关系我们不难构建出一个二叉树。
在这里插入图片描述

前序遍历的整体思想我们可以这样理解,要遵循这样一个遍历方式就是根左右。先输出根节点,然后左节点,然后右节点。每个节点的遍历都要遵循这种方式,因为栈的特点是先进后出,所以我们保证每次输出的元素都是根节点然后先将右节点压栈,在将左节点压栈,这样每次出栈都是先以左节点为主,符合我们根左右的模式。
在这里插入图片描述
中序遍历的整体思想就是左根右的模式,如果二叉树是一颗二叉查找树,那么通过中序遍历输出的结果就是一个有序的结果,因为二叉查找树的定义就是左节点比根节点小,右节点比根节点大,所以我们以左根右的模式输出的话就是有序的。
以下代码的思想是这样我们首先输出的第一个元素肯定是以左节点为主的最后一个叶子节点,所以我们以循环的方式将根节点的左节点一直压栈,然后在出栈,出栈的时候判断一下右节点是否为空,如果为空我们继续出栈,如果不为空将右节点压栈,右节点赋值给当前节点,继续执行之前的步骤即可。
在这里插入图片描述
后续遍历的整体思想就是左右根,这里我写了两种方法,第一种是比较有技巧的,我们理解起来也不难,借助了两个栈来实现,下面的图片比较清晰,我们也能比较快速的理解其实就是跟左右方式的逆序,换一句话说就是先序遍历的左右子树反过来,然后在逆序输出就可以了。

在这里插入图片描述
在这里插入图片描述

这种方式就是我们常规的思路了。以左右根的方式来遍历,所有我们最先输出的一定是左节点,然后是右节点,最后是根节点。
输出的条件就是左子树和右子树都为空,那这个节点就是叶子节点,还有一种不是叶子节点,我们的判断是保留上一次出栈的记录,如果上一次出栈的记录是当前节点的左孩子或者右孩子我们依然出栈,按照这整个思路我们有了以下代码。
在这里插入图片描述
层次遍历比较简单,借助队列这种数据结构。
在这里插入图片描述

自己测试了一下,这里只展示后续遍历的执行结果。
在这里插入图片描述
后续遍历的执行结果。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值