既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
😯最近一段时间,突然有点儿兴趣,刷刷数据结构。在刷的过程中,发现二叉树的递归遍历比较好,迭代后续遍历没有那么好写,也困扰了我一天。
🚗🚗🚗🚗今天就在炽热的天空下,凉凉的空调房里写一下如何使用栈实现二叉树的迭代后序遍历。
目录
一、二叉树迭代后续遍历需要思考的问题
二叉树的递归遍历,整体上都是一个结构套着出来的,就是打印根节点的位置不一样。就是递归左子树节点,打印根节点,递归右子树节点的组合。
根节点,在中间取值则是中序遍历。
func midRecur(root *TreeNode) []int {
var res []int
if root==nil {
return res
}
left := midRecur(root.Left)
val := root.Val
right := midRecur(root.Right)
res = append(res, left...)
res = append(res, val)
res = append(res, right...)
return res
}
二、🍻二叉树后序迭代遍历实现
后序迭代遍历的实现,其实就是手动模拟后续遍历二叉树的递归实现。但是这里面有一点小坑的就是,后续遍历二叉树是需要先把左右子树遍历完了,再访问根节点的值。这个时候就需要定义一个变量额外记录访问过的变量。
2.1🍺🍺🍺 二叉树定义
二叉树的定义是中规中矩喽~
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
2.2 🍖🍖🍖二叉树后续迭代遍历演化
这一块内容,就是逐步推演如何使用非递归遍历实现二叉树的后续。
2.2.1 一杆子捅到底
通过前面的二叉树后续递归遍历的代码,我们了解到二叉树的后续遍历,就是先访问左子树,再访问右子树。从结果上,我们也可以了解到首先打印的是最左边,最下面的节点。根据栈先进后出的特点,所以我们了解到要先把所有的最左侧的节点灌到栈里面。
func postIteration(root *TreeNode) []int {
l := list2.New()
back:=root
var res []int
for l.Len() != 0 || back != nil {
for back!=nil {
l.PushBack(back)
back=back.Left
}
element := l.Back() //取出栈顶元素
top := element.Value.(*TreeNode) //类型转换
}
return res
}
2.3 🍟🍟🍟栈顶出数,路在何方
上面的代码呢,我们已经最左侧的节点,都丢到栈里面了。丢完了以后呢,我们要取出来开始遍历数据了呢。首先呢,通过栈递归呢,我们知道,我们第一次取出的这个数据,是没有左子树的,但是可能有右子树。如果有右子树,那么右子树也需要入栈。如果没有右子树,这个节点的数据就可以取出并移除。
![img](https://img-blog.csdnimg.cn/img_convert/67d36f4fb4b11cbffc35b36115533b78.png)
![img](https://img-blog.csdnimg.cn/img_convert/9d4d952fc38faf1d44ecf2f879860325.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**