解题思路
二叉树的层序遍历一般采用 迭代 的方法,解题思路比较固定,基本逻辑框架如下:
- 借助队列(先进先出)
- 初始:根节点入队列
- 迭代开始:
当前队列中的节点依次出队列,每个节点出队列后需要:- 如果当前节点的左孩子存在,将左孩子入队列
- 如果当前节点的右孩子存在,将右孩子入队列 迭代直到队列为空结束,表示整棵树遍历完成。 在迭代过程中,可以根据题目实际情况,设置一些辅助变量,来保存遍历结果。
代码套路
解题思路比较固定,也就意味着二叉树层次遍历的代码逻辑也相对固定,代码基本结构如下:(本文代码使用 JavaScript)
- 迭代解法
// ...
// 声名一个变量,用于保存最终结果
const result = [];
// 声名一个队列,辅助遍历,并且初始化将二叉树的根节点入队列
const queue = [root];
// 迭代开始
while (queue.length > 0) {
// 注意:
// 这里建议使用一个临时变量记录队列长度,因为 JavaScript 中使用数组模拟队列。
// 在做队列的出队、入队操作时,会改变原数组,也就会影响队列长度(引用类型惹的祸)
const qLength = queue.length;
for (let i = 0; i < qLength; i++) {
const currentNode = queue.shift();
// 这里可以根据题目实际情况,对当前节点做一些逻辑处理
currentNode.left && queue.push(currentNode.left);
currentNode.right && queue.push(currentNode.right);
}
// ....
}
// ...
LeetCode 练习题
-
102. 二叉树的层序遍历
- 迭代解法
/** * @param {TreeNode} root * @return {number[][]} */ var levelOrder = function(root) { if (!root) { return []; } const result = []; const queue = [root]; while(queue.length > 0) { const sub = []; const qLength = queue.length; for (let i = 0; i < qLength; i++) { const currentNode = queue.shift(); sub.push(currentNode.val); currentNode.left && queue.push(currentNode.left); currentNode.right && queue.push(currentNode.right); } result.push(sub); } return result; };