二叉树的层序遍历
思路
常规思路,按顺序输出层序遍历的元素,不必在意该元素在哪一层上。
// 普通的层序遍历:每次只取一个元素拓展
// 先将树的根节点入队,
// 如果队列不空,则进入循环
// {
// 将队首元素出队,并输出它;
// 如果该队首元素有左孩子,则将其左孩子入队;
// 如果该队首元素有右孩子,则将其右孩子入队
// }
这里的层序遍历,需要将该元素所处的层也记录下来。
// 这里的层序遍历:每次取s_i个元素进行扩展
// 首先根元素入队
// 当队列不为空的时候
// 求当前队列的长度 s_i (s_i其实是当前层元素的个数)
// 依次从队列中取 s_i 个元素进行拓展,然后进入下一次迭代
代码
/**
* 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==null) return [];
let q = [];
let res = [];
q.push(root);
while(q.length>0){
let levelEles = [];
// 该层元素的个数
let num = q.length;
for(let i=0; i<num; i++){
let del = q.shift();
levelEles.push(del.val);
if(del.left!=null) q.push(del.left);
if(del.right!=null) q.push(del.right);
}
res.push(levelEles);
}
return res;
};
Z字形打印二叉树
思路
在上面例子的基础上,增加标志,用于顺序打印,还是逆序打印。
代码
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Print(pRoot)
{
let res = [];
let q = [];
if(pRoot) q.push(pRoot);
let isSeq = true;
// 层序遍历:队列不空,则取出该层元素,若孩子存在则入队
while(q.length>0){
let len = q.length;
let levelres = [];
// 遍历队列
for(let i=0; i<len; i++){
let temp = q.shift();
isSeq ? levelres.push(temp.val) : levelres.unshift(temp.val);
if(temp.left) q.push(temp.left);
if(temp.right) q.push(temp.right);
}
res.push(levelres);
isSeq = !isSeq;
}
return res;
}
module.exports = {
Print : Print
};