《剑指offer》刷题笔记。如有更好解法,欢迎留言。
关键字:树的广度遍历(层次遍历)、队列
题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:
1. 本题可以在《把二叉树打印成多行》的基础上修改(传送门)
2. 至此已完成按层次输出树的数组
3. 题目可以理解为偶数行按照从左到右的顺序打印,奇数行按照从右至左的顺序打印。所以只需要遍历结果数组,将奇数行反转就行了。
- 完整代码
function Print(pRoot){
if(!pRoot)return [];
let queue = [];
let map = new Map();
map.set(pRoot,0);
queue.push(pRoot);
while(queue.length){
let node = queue.shift();
let deep = map.get(node);
if(node.left){
queue.push(node.left);
map.set(node.left,deep+1);
}
if(node.right){
queue.push(node.right);
map.set(node.right,deep+1);
}
}
let res = [];
for(let item of map.entries()){
let val = item[0];
let deep = item[1];
res[deep] = Array.isArray(res[deep]) ? res[deep] : [];
res[deep].push(val.val);
}
for(let i = 0;i < res.length;i++){
if(i % 2 === 1){
res[i] = res[i].reverse();
}
}
return res;
}
网友评论