* 二叉树构造函数
/** * 树节点 * @class */ function TreeNode(val, left, right) { this.val = (val === undefined ? 0 : val); this.left = (left === undefined ? null : left); this.right = (right === undefined ? null : right); }
直接上代码(含必要注释)
1. BFS(广度优先搜索)
1 /** 2 * @param {TreeNode} root 3 * @return {number[][]} 4 */ 5 var levelOrder = function(root) { 6 // 处理根节点为空的特殊情况 7 if (root === null) return []; 8 // 初始化一个队列(根节点入队) 9 const q = [root]; 10 // 初始化结果数组 11 const ans = []; 12 // 遍历节点队列 13 while (q.length > 0) { 14 // 记录当前队列中的节点数量 15 let cnt = q.length; 16 // 初始化当前层节点的容器 17 const level = []; 18 // 遍历当前层的节点 19 while (cnt-- > 0) { 20 const node = q.shift(); 21 level.push(node.val); 22 // 左子节点先入队 23 if (node.left !== null) q.push(node.left); 24 // 右子节点后入队(以保持从左到右的顺序) 25 if (node.right !== null) q.push(node.right); 26 } 27 // 将当前层的遍历结果推入结果数组 28 ans.push(level); 29 } 30 31 return ans; 32 };
2. DFS(深度优先搜索)
2.1. 递归版本
1 var levelOrder = function(root) { 2 // 结果容器(二维数组) 3 const ans = []; 4 // 搜索所有节点(从第一层开始,对应索引为0) 5 dfs(root, 0, ans); 6 7 return ans; 8 }; 9 10 var dfs = function(node, level, cont) { 11 // 如果节点为空,终止当前搜索 12 if (node === null) return; 13 // 比对当前结果容器中的层级结果容器数量与当前层(位置), 14 // 如果未初始化当前层的结果容器,则推出一个新数组 15 if (cont.length <= level) cont.push([]); 16 // 向当前层的结果容器中加入目标值 17 cont[level].push(node.val); 18 // 递归左子树 19 dfs(node.left, level + 1, cont); 20 // 递归右子树 21 dfs(node.right, level + 1, cont); 22 };
2.2. 迭代版本
1 var levelOrder = function(root) { 2 // 根节点为空直接返回 3 if (root === null) return []; 4 // 遍历结果 5 const ans = []; 6 // 节点栈(模拟系统栈,初始化时,root节点随即入栈) 7 const stk = [root]; 8 // 层级栈(用于记录对应节点的所属层级,root所在层级记为0,也可以为1) 9 const level_stk = [0]; 10 11 while (stk.length > 0) { 12 const node = stk.pop(); 13 const level = level_stk.pop(); 14 // 如果当前层级的数据容器在ans中还不存在(初始化一个新数组并推入) 15 if (ans.length <= level) ans.push([]); 16 // 在当前节点所属层级的数组中记录自身值 17 ans[level].push(node.val); 18 // 处理当前节点的右子树 19 if (node.right !== null) { 20 stk.push(node.right); 21 level_stk.push(level + 1); 22 } 23 // 处理当前节点的左子树 24 if (node.left !== null) { 25 stk.push(node.left); 26 level_stk.push(level + 1); 27 } 28 } 29 30 return ans; 31 };