初级算法练习第九节

91 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

1. 引言

接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…

2. 题型

  1. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 image
示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]


示例 3:

输入:root = []
输出:[]


提示:

树中节点数目在范围 [0, 2000] 
-1000 <= Node.val <= 1000

思路:
使用第三种迭代法,先进行目标对象判空处理,在使用一个数组记录,queue 为整树;使用while迭代时,当res记录数组为空默认赋值后,在一层while迭代循环,当记录数组中没有当前层数据时候,记录进去树的左侧和右侧并且树层减一;level 记录增加一进入下一循环; 解答:

/**
 * 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 []
    var res = []
    var queue = [root]
    root.depth = 0
    while(queue.length){
        var node = queue.shift()
        var depth = node.depth
        if(!res[depth]){
            res[depth] = [node.val]
        }else{
            res[depth].push(node.val)
        }
        var left = node.left
        var right = node.right
        if(left) {
            left.depth = depth + 1
            queue.push(left)
        }
        if(right){
            right.depth = depth + 1
            queue.push(right)
        }   
    }
    return res
};
// 方法2 递归
var levelOrder = function(root) {
    if(!root) return []
    var res = []
    helper(root,0)
    function helper(node,level){
        if(!node) return
        if(!res[level]){
            res[level] = [node.val]
        }else{
            res[level].push(node.val)
        }
        var left = node.left
        var right = node.right
        helper(left,level + 1)
        helper(right,level + 1)
    }
    return res
}
// 方法3 迭代方法改进
var levelOrder = function(root) {
    if(!root) return []
    var res = []
    var queue = [root]
    var level = 0
    while(queue.length){
        if(!res[level]){
            res[level] =[]
        }
        var length = queue.length
        while(length){
            var cur = queue.shift()
            res[level].push(cur.val)
            var left = cur.left
            var right = cur.right
            left && queue.push(left)
            right && queue.push(right)
            length -- 
        }
        
        level ++
    }
    return res
};