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

357 阅读1分钟

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

题目

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

image.png

示例1

输入:

{1,2,3}

返回值:

[1,2,3]

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)        first = append(first,root.Val)
(3)        rush(root.Left)
(4)        rush(root.Right)
        return
    }
(5)    rush(root)
    return first
}
  • (1) 定义一个深度优先遍历的函数
  • (2) 先把节点添加到列表中保存起来
  • (3) 再对左进行遍历
  • (4) 再对右进行遍历
  • (5) 传入节点启动遍历

非递归

先把头节点压入栈,判断这个头节点有无右孩子,再把右孩子压入,之后把左孩子压入即可!

func firstSort(root *TreeNode) []int{
(1)    stack := []*TreeNode{root}
    var ans []int
    if root == nil{
        return ans
    }
(2)    for len(stack) != 0 {
(3)        node := stack[len(stack)-1]
(4)        stack = stack[:len(stack)-1]
(5)        ans = append(ans, node.Val)
        if node.Right != nil {
(6)            stack = append(stack,node.Right)
        }
        if node.Left != nil {
(7)            stack = append(stack,node.Left)
        }
    }
    return ans
}
  • (1) 定义一个栈
  • (2) 如果这个栈不为空的话,就一直遍历下去
  • (3) 获取栈顶元素,数组进行模拟栈,所以把最后一个元素取出来
  • (4) 除去栈顶元素,数组模拟栈,所以就是把数组的最后一个元素去除
  • (5) 将这个元素的值进行记录
  • (6) 如果这个元素的右边不为空就先压右边节点入栈
  • (7) 然后再压左边节点入栈,因为栈式先进后出的。