非递归迭代实现二叉树前序,中序,后序遍历

文章详细介绍了如何非递归地进行二叉树的前序、中序和后序遍历,强调了利用栈和‘左路结点’的概念,通过左子树、根节点和右子树的顺序来指导遍历过程,并提供了相应的解题思路和代码实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1. 前序遍历

在这里插入图片描述
题目链接

解题思路
非递归遍历一棵树有两点:
1.左路结点 2.左路结点的右子树

什么意思呢
我们知道前序遍历是按照根,左子树,右子树来的。所以它是先根,然后左子树,根,左子树一直走到左子树为空。
在这里插入图片描述
红色的就叫做左路结点。蓝色的就是左路结点的右子树。然后我们再把蓝色的再看作子树划分出左路结点和左路结点的右子树。

大致流程
在这里我们需要利用一个栈:
在这里插入图片描述
在这里插入图片描述
因为走的是前序,根,左子树。所以8,3,1是一开始直接入栈和数组的。
在这里插入图片描述
当cur走到1的左子树为空时,我们就要让1出栈,然后走1的右子树。1的右子树也为空。那么我们继续出栈,走的是3的右子树。
在这里插入图片描述
然后我们再按照左路结点和左路结点的右子树来划分。走的是6的左子树,6的左子树为空。说明6的左路结点已结束,6出栈,走6的右子树。按照这样的逻辑一直走到10的时候。
在这里插入图片描述
10的左子树为空,那么此时10出栈。然后走10的右子树,10的右子树也为空。
在这里插入图片描述
当cur和栈都为空时就遍历完了。

代码如下
在这里插入图片描述

2. 中序遍历

在这里插入图片描述
题目链接
中序遍历和前序遍历的区别不是很大。中序遍历是:左子树,根,右子树。所以,我们中序遍历是左子树访问完了之后,再来访问根。

那么什么时候代表着左子树访问完成了呢
当我们取出栈顶数据时,代表左子树访问完成了。那么这个时候就可以访问根了!!!

代码如下:
在这里插入图片描述

3. 后序遍历

在这里插入图片描述
题目链接

后序遍历就不太好弄了。但是还是按照左路结点和左路结点的右子树规则。
在这里插入图片描述
按照左路结点先入栈,来到了1的左子树,左子树为空,访问1的右子树。右子树为空,再出栈,访问根。
在这里插入图片描述
此时3的左子树访问完了,我们要访问3的右子树。然后按照左路结点和左路结点的右子树继续划分。
在这里插入图片描述
6的左子树为空,那么6这颗树的左路结点入栈完成。此时6的右子树不为空,访问6的右子树。7的左子树,右子树都为空。那么就出栈,访问根。此时就可以访问根6了。
在这里插入图片描述
那么现在的问题是:第一次遇到6和第二次遇到6,我们怎么区别呢
如果上一个被访问的结点7是根6的右子树的根,那么说明3的右子树被访问过了,可以访问6了

所以后序遍历能访问根可以有两个判断:
1.右为空
2.上一个被访问的结点是当前结点的右子树根

代码如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值