22-树-二叉树的后序遍历

本文介绍了如何使用迭代方式实现二叉树的后序遍历,通过栈数据结构来保证遍历顺序,并给出了递归版本的代码示例。后序遍历在删除或释放树节点时具有重要意义。
摘要由CSDN通过智能技术生成

这是树的第22篇算法,力扣链接

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

输入:root = [1,null,2,3]
输出:[3,2,1]

我们来回忆一下后续遍历逻辑:

后序遍历 (Postorder Traversal)

后序遍历的顺序是:

  1. 遍历左子树
  2. 遍历右子树
  3. 访问根节点

后序遍历常用于删除或释放树中的节点。因为你在删除节点之前先访问其子节点,这样可以安全地删除每个节点。

 例子

假设有一棵二叉树如下:

    A
   / \
  B   C
 / \   \
D   E   F
  • 后序遍历D, E, B, F, C, A。首先是左子树(D, E, B),然后是右子树(F, C),最后是根节点(A)。

 后续遍历会优先去到最左节点,然后一点一点往回走。

func postorderTraversal(root *TreeNode) []int {
	var result []int
	if root == nil {
		return result
	}
	var (
		stack []*TreeNode
		prev  *TreeNode
	)
	for root != nil || len(stack) > 0 {
		for root != nil {
			stack = append(stack, root)
			root = root.Left
		}
		node := stack[len(stack)-1]
		if node.Right == nil || node.Right == prev {
			result = append(result, node.Val)
			prev = node
			stack = stack[:len(stack)-1]
		} else {
			root = node.Right
		}
	}
	return result
}

递归写法:

func postorderTraversal(root *TreeNode) []int {
	var result []int
	var postorder func(*TreeNode)
	postorder = func(node *TreeNode) {
		if node == nil {
			return
		}
		postorder(node.Left)
		postorder(node.Right)
		result = append(result, node.Val)
	}
	postorder(root)
	return result
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值