给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]1\2/3输出: [3,2,1]
解法一:递归
func postorderTraversal(root *TreeNode) []int {res := []int{}var postOrder func(root *TreeNode)postOrder = func(root *TreeNode) {if root == nil {return}postOrder(root.Left)postOrder(root.Right)res = append(res, root.Val)}postOrder(root)return res}
解法二:投机取巧
后序是:左右根
前序是:根左右
把前序改造为 根右左 ,将最后结果逆序即可。
func postorderTraversal(root *TreeNode) []int {
res := []int{}
var postOrder func(root *TreeNode)
postOrder = func(root *TreeNode) {
if root == nil {
return
}
postOrder(root.Right)
postOrder(root.Left)
res = append(res, root.Val)
}
postOrder(root)
left, right := 0, len(res)-1
for left < right {
res[left], res[right] = res[right], res[left]
left++
right--
}
return res
}
func postorderTraversal(root *TreeNode) []int {
res := []int{}
stack := []*TreeNode{}
top := root
for len(stack) > 0 || top != nil {
for top != nil {
res = append(res, top.Val)
stack = append(stack, top.Left)
top = top.Right
}
top, stack = stack[len(stack)-1], stack[:len(stack)-1]
}
left, right := 0, len(res)-1
for left < right {
res[left], res[right] = res[right], res[left]
left++
right--
}
return res
}
解法三:迭代
func postorderTraversal(root *TreeNode) []int {
res := []int{}
stack := []*TreeNode{}
top := root
var prev *TreeNode
for len(stack) > 0 || top != nil {
for top != nil {
stack = append(stack, top)
top = top.Left
}
top, stack = stack[len(stack)-1], stack[:len(stack)-1]
// 不存在有节点的和右节点是前面遍历过的
if top.Right == nil || top.Right == prev {
res = append(res, top.Val)
// 实际上这个 prev 是上一个遍历的节点,或者说是上一个被输出的节点
prev = top
top = nil
} else {
stack = append(stack, top)
top = top.Right
}
}
return res
}
