最全go语言实现二叉树的迭代后续遍历_二叉树后续遍历go语言(2),腾讯、阿里Golang高级面试真题汇总

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

目录

一、二叉树迭代后续遍历需要思考的问题

二、🍻二叉树后序迭代遍历实现

2.1🍺🍺🍺 二叉树定义

2.2 🍖🍖🍖二叉树后续迭代遍历演化

2.2.1 一杆子捅到底

2.3 🍟🍟🍟栈顶出数,路在何方

2.3 🍟🍟🍟一次就好,整太多没用

三、🍏🍏🍏总结



一、二叉树迭代后续遍历需要思考的问题

二叉树的递归遍历,整体上都是一个结构套着出来的,就是打印根节点的位置不一样。就是递归左子树节点,打印根节点,递归右子树节点的组合。

根节点,在中间取值则是中序遍历。

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 🍟🍟🍟栈顶出数,路在何方

上面的代码呢,我们已经最左侧的节点,都丢到栈里面了。丢完了以后呢,我们要取出来开始遍历数据了呢。首先呢,通过栈递归呢,我们知道,我们第一次取出的这个数据,是没有左子树的,但是可能有右子树。如果有右子树,那么右子树也需要入栈。如果没有右子树,这个节点的数据就可以取出并移除。

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) //类型转换
		//右子树不为空,那么右子树也需要入栈
		if top.Right!=nil {


![img](https://img-blog.csdnimg.cn/img_convert/43416105f001a3e91cb932b902ef5769.png)
![img](https://img-blog.csdnimg.cn/img_convert/881cf55751bb4be9e5b0b9e19aa0bc97.png)
![img](https://img-blog.csdnimg.cn/img_convert/1545833a80d0892f3ed223a3e7f4f289.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值