
( ̄▽ ̄)” 太久没练手了,都生疏了
用到的知识点明显是 BFS ,可能上课的时候有讲过层序遍历,但我已经忘得一干二净了,巩固基础吧,太菜了。
方法一:BFS 迭代
思路:对一棵二叉树进行层序遍历,可用迭代的方式实现,将根节点放入一个辅助队列中,然后不断遍历队列。
步骤:
- 首先特殊判断,是否为空树。
- 然后创建一个答案数组,一个辅助队列,将根节点放入辅助队列
- 对队列进行遍历,直至队列为空
- 对队列的头部结点进行弹出并保存其值,将其值保存在一个区别各层间数据的辅助数组
- 判断这个结点的左右子结点是否存在,若存在即将其弹入队列的尾部
- 重复 4,5 步
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function (root) {
    if (!root) return []
    let res = []
    let queue = [root]
    while (queue.length) {  // 遍历直至辅助队列为空
        let len = queue.length
        let level_res = []
        for (let i = 0; i < len; i++) {
            let temp = queue.shift()   // 将辅助队列头部弹出并保存
            if (temp.left) queue.push(temp.left)  // 判断左右子结点是否存在
            if (temp.right) queue.push(temp.right)
            level_res.push(temp.val)
        }
        res.push(level_res)
    }
    return res
};
复制代码方法二:DFS 递归
思路:(看了解析之后结合自己的理解)带着一个 index (标记层数)标签去先序遍历整个二叉树,每次都将二叉树的数据按照 index 区分开来。
var levelOrder = function (root) {
    if(!root) return [] // 特殊判断
    let res=[[]]   // 特定给根节点保留一个数组层
    DFS(root,res,0)  // DFS 入口
    return res
};
var DFS = function(node,res,index){
    if(!node) return    // 如果结点为空,返回
    if(res.length<=index) res.push([])    // 提前插入一层数组,避免"of null"
    res[index].push(node.val)   // 开始先序遍历,插入对应的层数
    DFS(node.left,res,index+1)  // 左子树遍历
    DFS(node.right,res,index+1) // 右子树遍历
}
复制代码明显感觉 DFS 的代码更简洁,因为 DFS 隐含地调用了一个栈结构,不需要自己维护。
时间复杂度都为 O(N)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
