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

156 阅读1分钟

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

题目

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

image.png

示例1

输入:

{1,2,3}

返回值:

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

非递归

和先序遍历很相似,也是直接使用数组模拟栈,如果节点的左孩子还有的话,就一直遍历左边,然后再把遍历右边

func middleSort(root *TreeNode) []int{
    stack := []*TreeNode{}
    var ans []int
    if root == nil {
        return ans
    }
(1)    for len(stack) != 0 || root!=nil {
        if root != nil {
(2)            stack = append(stack, root)
(3)            root = root.Left
        } else {
(4)            root = stack[len(stack)-1]
(5)            ans = append(ans,root.Val)
(6)            stack = stack[:len(stack)-1]
(7)            root = root.Right
        }
    }
    return ans
}
  • (1) 如果这个栈不为空或者说这个节点不是空的,就可以进行遍历
  • (2) 把这个节点放入栈中
  • (3) 让这个root等于这个root的左孩子,就像链表一样一直遍历左边,
  • (4) 知道左边为空了之后,将栈顶移除,这个就是最后一次的左边遍历的底部
  • (5) 将这个栈顶元素的值进行记录
  • (6) 移除栈顶元素
  • (7) 让节点等于右边的节点再进行不断地遍历