请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
分析:实现思路和普通层次从左到右输出基本一致,只在每层的数组perLevelItem输出到最终数组arr前,隔一行反转一次。
可先参考普通层次遍历:https://blog.csdn.net/qq_37246828/article/details/106351448,两者另外一个区别是,普通层次遍历,输出arr是一维数组;而本题的输出arr为二维数组;该区别点可互相转化。
// pRoot结构
{
val: 0,
left: {
val: 1
},
right: {
val: 2
}
}
// 最终的arr是二维数组,每一个元素代表一层val
function Print(pRoot) {
let queue = []
let arr = [] // 最终输出,二维数组,每个元素代表一层
let flag = true // 该层是否从左到右排列
queue.push([pRoot])
while (queue.length) {
let perLevelObj = [] // 每一层的节点对象,从左到右排列
let perLevelItem = [] // 每一层节点值,先默认从左到右排列,再根据flag进行反转
let head = queue.shift()
head.forEach((item) => {
perLevelItem.push(item.val)
item.left && perLevelObj.push(item.left)
item.right && perLevelObj.push(item.right)
})
!flag && perLevelItem.reverse() // 根据flag进行反转
flag = !flag // 隔一行反转一次
arr.push(perLevelItem)
perLevelObj.length && queue.push(perLevelObj)
}
return arr
}