零 標題:演算法(leetcode,附思維導圖 + 全部解法)300題之(102)二叉樹的層序遍歷
一 題目描述
二 解法總覽(思維導圖)
三 全部解法
1 方案1
1)程式碼:
// 方案1 “自己。2個佇列法”。
// 思路:
// 1)邊界:若 root 為假值,則 直接返回 [] 。
// 2)狀態初始化:let resList = [], curLevel = 0, queue_1 = [root], queue_2 = [] 。
// 3)核心:跟2個佇列(queue_1、queue_2)情況,對該二叉樹進行遍歷處理。
// 4)返回結果 resList 。
var levelOrder = function(root) {
// 1)邊界:若 root 為假值,則 直接返回 [] 。
if (!root) {
return [];
}
// 2)狀態初始化:let resList = [], curLevel = 0, queue_1 = [root], queue_2 = [] 。
let resList = [],
curLevel = 0,
queue_1 = [root],
queue_2 = [];
// 3)核心:跟2個佇列(queue_1、queue_2)情況,對該二叉樹進行遍歷處理。
while (queue_1.length !== 0) {
const {val, left, right} = queue_1.shift();
// 邊界
if (resList[curLevel] === undefined) {
resList[curLevel] = [];
}
resList[curLevel].push(val);
if (left) {
queue_2.push(left);
}
if (right) {
queue_2.push(right);
}
if (queue_1.length === 0) {
curLevel++;
// 注:以下2行 可簡寫成 [queue_1, queue_2] = [queue_2, []] 。
queue_1 = queue_2;
queue_2 = [];
}
}
// 4)返回結果 resList 。
return resList;
}
2 方案2
1)程式碼:
// 解法2 “自己。1個佇列法(本質:方案1的優化版)”。
// 思路:
// 1)邊界:若 root === null ,則 直接返回 [] 。
// 2)狀態初始化:queue = [root], curLevel = 0, resList = [] 。
// 3)核心:若 queue.length !== 0,則 迴圈處理。
// 3.1)核心:處理本次 佇列queue 裡的所有節點
// 並將各節點值放入當前層次的列表中。
// 3.1.1)初始化本層列表。
// 3.1.2)分別根據 左、右子樹 情況,更新 queue 值。
// 3.2)更新層次的值 curLevel++ 。
// 4)返回結果 resList 。
var levelOrder = function(root) {
// 1)邊界:若 root === null ,則 直接返回 [] 。
if (root === null) {
return [];
}
// 2)狀態初始化:queue = [root], curLevel = 0, resList = [] 。
let queue = [root],
curLevel = 0,
resList = [];
// 3)核心:若 queue.length !== 0,則 迴圈處理。
while (queue.length !== 0) {
// 3.1)核心:處理本次 佇列queue 裡的所有節點
// 並將各節點值放入當前層次的列表中。
const l = queue.length;
for (let i = 0; i < l; i++) {
const {val, left, right} = queue.shift();
// 3.1.1)初始化本層列表。
if (!resList[curLevel]) {
resList[curLevel] = [];
}
resList[curLevel].push(val);
// 3.1.2)分別根據 左、右子樹 情況,更新 queue 值。
if (left !== null) {
queue.push(left);
}
if (right !== null) {
queue.push(right);
}
}
// 3.2)更新層次的值 curLevel++ 。
curLevel++;
}
// 4)返回結果 resList 。
return resList;
}
3 方案3
1)程式碼:
// 解法3 “遞迴”。
// 參考:
// 1)https://leetcode.cn/problems/binary-tree-level-order-traversal/solution/dai-ma-jian-ji-yi-chong-huan-bu-cuo-de-j-139f/
// 思路:
// 1)狀態初始化:curLevel = 0, curRoot = root, resList = [] 。
// 2)核心:呼叫遞迴函式。
// 3)返回結果 resList 。
var levelOrder = function(root) {
// 遞迴函式
const dfs = (curLevel = 0, curRoot = null) => {
// 1)遞迴出口
if (curRoot === null) {
return;
}
// 2)遞迴主體
const {val, left, right} = curRoot;
// 2.1)初始化 本層的列表 。
if (!resList[curLevel]) {
resList[curLevel] = [];
}
// 2.2)本層的列表塞入 當前的節點值 。
resList[curLevel].push(val);
// 2.3)分別遞迴處理 左、右子樹 。
dfs(curLevel + 1, left);
dfs(curLevel + 1, right);
};
// 1)狀態初始化:curLevel = 0, curRoot = root, resList = [] 。
let curLevel = 0,
curRoot = root,
resList = [];
// 2)核心:呼叫遞迴函式。
dfs(curLevel, curRoot);
// 3)返回結果 resList 。
return resList;
}
四 資源分享 & 更多
1 歷史文章 - 總覽
2 博主簡介
碼農三少 ,一個致力於編寫 極簡、但齊全題解(演算法) 的博主。
專注於 一題多解、結構化思維 ,歡迎一起刷穿 LeetCode ~