题目描述
给定一个二叉树,返回它的 后序 遍历。
方法一:递归
解题思路
- 递归访问树
- 先保存右子树返回值,再保存左子树返回值
- 最后保存根结点的值
代码实现
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
}