携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
1. 引言
接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…
2. 题型
- 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 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
};