二叉树遍历之广度(层次)遍历2——之字形顺序输出(牛客网-题库-在线编程-剑指offer题目)

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

分析:实现思路和普通层次从左到右输出基本一致,只在每层的数组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
}

你可能感兴趣的:(刷题)