【剑指offer】二叉树后序遍历(递归与非递归) [Go语言]

163 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

给定一棵二叉树,分别按照二叉树后序打印所有的节点。

image.png

示例1

输入:

{1,2,3}

返回值:

[2,3,1]

AC Code

递归

func threeOrders( root *TreeNode ) []int {
    var first []int
    var rush func(root *TreeNode)
(1)    rush = func(root *TreeNode) {
        if root == nil {
            return
        }
(2)        rush(root.Left)
(3)        rush(root.Right)
(4)        first = append(first,root.Val)
        return
    }
(5)    rush(root)
    return first
}
  • (1) 定义一个深度优先遍历的函数
  • (2) 先对左进行遍历
  • (4) 再对右进行遍历
  • (3) 再把节点添加到列表中保存起来
  • (5) 传入节点启动遍历

非递归

func backSort( root *TreeNode ) []int{
    res := []int{}
    if root == nil {
        return res
    }
(1)    stack:=[]*TreeNode{root}
(2)    pre := &TreeNode{}
    for len(stack) != 0 {
(3)        cur := stack[len(stack)-1]
(4)        if (cur.Left==nil && cur.Right==nil) || (pre!=nil && (pre==cur.Left||pre==cur.Right)){
(5)            res = append(res,cur.Val)
(6)            pre = cur
(7)            stack = stack[:len(stack)-1]
        }else{
            if cur.Right != nil {
(8)                stack=append(stack, cur.Right)
            }
            if cur.Left != nil {
(9)                stack = append(stack,cur.Left)
            }
        }
    }
    return res
}
  • (1) 定义一个栈作为存储
  • (2) 定义一个存储节点
  • (3) 让当前的节点等于这个栈顶元素
  • (4) 如果这个节点元素的左边是空以及右边是空 或者说这个pre节点不为空以及这个节点等于左边或是右边
  • (5) 就把当前节点的值存起来
  • (6) 然后让pre等于当前的节点
  • (7) 并且把这个栈顶元素除去
  • (8) 如果左边节点不为空就放左边
  • (9) 右边不为空放右边