二叉树的前中后序遍历

155 阅读1分钟

根左右

  • 递归
const root_deep = tree => {
    const res = []

    const traverse = t => {
        const { value, left, right } = t
        // 根
        res.push(value)
        // 左
        if (left) traverse(left)
        // 右
        if (right) traverse(right)
    }

    traverse(tree)

    return res
}
  • 非递归
const root_notdeep = tree => {
    const res = []
    const stack = [tree]

    while(stack.length) {
        const { value, left, right } = stack.pop()
        res.push(value)

        if (right) stack.push(right)
        if (left) stack.push(left)

    }

    return res
}

左根右

  • 递归
const left_deep = tree => {
    const res = []

    const traverse = t => {
        const { value, left, right } = t
        // 左
        if (left) traverse(left)
        // 根
        res.push(value)
        // 右
        if (right) traverse(right)
    }

    traverse(tree)

    return res
}
  • 非递归
const left_notdeep = tree => {
    const res = []

    let node = tree
    const stack = []

    while(node || stack.length) {
        while(node) {
            stack.push(node)
            node = node.left
        }

        const { value, left, right } = stack.pop()
        res.push(value)

        node = right
    }

    return res
}

左右根

  • 递归
const right_deep = tree => {
    const res = []

    const traverse = t => {
        const { value, left, right } = t
        // 左
        if (left) traverse(left)
        // 右
        if (right) traverse(right)
        // 根
        res.push(value)
    }

    traverse(tree)

    return res
}
  • 非递归(其实就是 根右左 的倒序)
const right_notdeep = tree => {
    const res = []
    const stack = [tree]

    while(stack.length) {
        const { value, left, right } = stack.pop()
        res.push(value)


        if (left) stack.push(left)
        if (right) stack.push(right)
        

    }

    return res.reverse()
}