二叉树遍历之广度(层次)遍历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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值