leetcode-145:树的后序遍历

题目描述

给定一个二叉树,返回它的 后序 遍历。

方法一:递归

解题思路

  • 递归访问树
  • 先保存右子树返回值,再保存左子树返回值
  • 最后保存根结点的值

代码实现

func postorderTraversal(root *TreeNode) []int {
	var res []int
	if root == nil {
		return res
	}

	res = append(res, postorderTraversal(root.Left)...)
	res = append(res, postorderTraversal(root.Right)...)
	res = append(res, root.Val)
	return res
}

方法二:迭代

解题思路

  • 同前中序遍历,后序遍历需要先访问左子树,后访问右子树,最后访问根节点
  • 用一变量保存上次弹出队列的节点
  • 观察当前节点无右子树或者右子树已经访问过时再出栈保存

代码实现

func postorderTraversal(root *TreeNode) []int {
	var res []int
	if root == nil {
		return res
	}

	var lastVisit *TreeNode
	queue := make([]*TreeNode, 0)
	for root != nil || len(queue) > 0 {
		for root != nil {
			queue = append(queue, root)
			root = root.Left
		}

		// 先观察,不出队列
		node := queue[len(queue)-1]
		if node.Right == nil || node.Right == lastVisit {
			// 该节点没有右节点,或者右节点已经访问过
			res = append(res, node.Val)
			queue = queue[:len(queue)-1]
			// 标记该节点为上次弹出节点
			lastVisit = node
		} else {
			root = node.Right
		}
	}
	return res
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页