【每日算法0216】搜索与回溯算法(简单)

57 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

题目

剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

示例:

给定二叉树: [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回:

[3,9,20,15,7]

分析一

先按自己的思路来一版

首先定义一个数组作为最终的返回值

二叉树题目常规思路使用递归

那么我们的思路就是从上到下遍历每一层,

退出条件就是当前层的节点数为0时

递归内部的行为就是从左往右将当前节点值添加到结果数组中,然后在从左往右维护一个数组,作为下一次递归的输入值

递归结束,输出结果

实现

function levelOrder(root: TreeNode | null): number[] {
    if (!root) return []
​
    let res: number[] = []
    function handle(list: TreeNode[]) {
        if (!list.length) return
        let tmp = []
        for (let i = 0; i < list.length; i ++) {
            const node = list[i]
            res.push(node.val)
            if (node.left) {
                tmp.push(node.left)
            }
            if (node.right) {
                tmp.push(node.right)
            }
        }
        handle(tmp)
    }
​
    handle([root])
​
    return res
};

分析二

看了解析有一种更合理的解决方式,使用队列的形式来解决,利用队列先进先出的特性,实现从上往下层层遍历

实现

function levelOrder(root: TreeNode | null): number[] {
    if (!root) return []
​
    let res: number[] = []
    let queue: TreeNode[] = []
​
    queue.push(root)
​
    while(queue.length) {
        const node = queue.shift()
        res.push(node.val)
        if (node.left) {
            queue.push(node.left)
        }
        if (node.right) {
            queue.push(node.right)
        }
    }
​
    return res
};

题目

剑指 Offer 32 - II. 从上到下打印二叉树 II

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如: 给定二叉树: [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

分析

这道题和上一道类似,只是返回的数据结果不同,那么我们使用同样的思路在做一遍,只要最终结果处理一下

由于同层的需要作为一个数组返回,我们需要在循环的时候维护一个中间变量来存储同层的结果,在进行循环

实现

function levelOrder(root: TreeNode | null): number[][] {
    if (!root) return []
​
    let res: number[][] = []
    let queue: TreeNode[] = []
    queue.push(root)
    while(queue.length) {
        let tmp:number[] = []
        let len = queue.length
        let index = 0
​
        while(index < len) {
            const node = queue.shift()
            tmp.push(node.val)
            if (node.left) {
                queue.push(node.left)
            }
            if (node.right) {
                queue.push(node.right)
            }
            index ++
        }
        res.push(tmp)
    }
​
    return res
};