给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)

在线评测地址:LintCode 领扣

样例 1:

输入:{1,2,3}
输出:[[1],[3,2]]
解释:1/ 2   3
它将被序列化为 {1,2,3}

样例 2:

输入:{3,9,20,#,#,15,7}
输出:[[3],[20,9],[15,7]]
解释:3/ 9  20/  15   7
它将被序列化为 {3,9,20,#,#,15,7}

【题解】

算法:树的层次遍历

层次遍历,可以运用广度遍历的思想实现从上往下的逐层遍历。从头结点开始逐层遍历,开辟一个新队列,让头结点入队并计算此时的长度,每次都将当前层的子节点全部压入队列,然后对下一层的节点进行遍历,再将下一层的子节点压入队列,不断循环,一直遍历到底层,判断的终止条件就是队列不为空。

  • 循环里面,队列头出队,判断其是否有左右子结点,如果有,则将此点的子节点入队,但此时还不需要更新队列的长度,当前队列的长度是每层的长度。当这层的长度减为0时,就说明这层的遍历结束,开始更新长度为下一层的长度。
  • 出队的元素的值按照一层层压入结果数组
  • 因为题目锯齿形遍历
  • 我们用一个isforward标记当前方向,每遍历完一层,如果是反向的,则将这层的节点数组倒序,然后将这层的集合压入结果

复杂度分析

  • 时间复杂度O(n)

    • n为节点数量
  • 空间复杂度O(n)
    • 存下所有点的信息 n为节点数量
 public class Solution
{/*** @param root: A Tree* @return: A list of lists of integer include the zigzag level order traversal of its nodes' values.*/public List<List<Integer>> zigzagLevelOrder(TreeNode root){List<List<Integer>> ans = new ArrayList<List<Integer>>();if (root == null) {return ans;}Queue<TreeNode> q = new LinkedList<TreeNode>();//正反向标志boolean isForward = true;q.offer(root);while (!q.isEmpty()) {int size = q.size();List<Integer> subList = new ArrayList<Integer>();for (int i = 0 ; i < size ; i++) {TreeNode treeNode = q.poll();subList.add(treeNode.val);if (treeNode.left != null) { q.offer(treeNode.left);}if (treeNode.right != null) {q.offer(treeNode.right);}}//根据标志来确认当前层遍历的方向if (!isForward) {Collections.reverse(subList);//翻转}ans.add(subList);//方向反转isForward = !isForward;}return ans;}
}

更多题解参见:九章算法

编号是i的结点所在的层次号是_九章算法 | 微软面试题:二叉树的锯齿形层次遍历...相关推荐

  1. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  2. 103. 二叉树的锯齿形层次遍历/102. 二叉树的层序遍历

    2020-05-24 1.题目描述 二叉树的锯齿形层次遍历 2.题解 对于层次遍历而言,就是广度优先,由于题目要求奇数层逆序,我们可以 1)使用双端队列,奇偶性不同,则出入队列方式不同. 2)对于偶数 ...

  3. LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

    103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...

  4. 【LeetCode】103# 二叉树的锯齿形层次遍历

    题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], ...

  5. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  6. 二叉树的锯齿形层次遍历—leetcode103

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3/ \ ...

  7. 二叉树的锯齿形层次遍历

    1.题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7 ...

  8. 103. 二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3   ...

  9. leetcode103. 二叉树的锯齿形层次遍历(bfs)

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行).例如: 给定二叉树 [3,9,20,null,null,15,7],3/ \9 ...

最新文章

  1. js 月份加6个月_12月AHA HS大众急救认证培训22个城市报名开启!2021年1~6月份课程预售限时开启!!...
  2. 如何在群晖服务器上启用plex远程访问,如何在Synology NAS上更新Plex | MOS86
  3. anaconda3 win7_重装系统win7
  4. 59 MM配置-后勤发票校验-维护税代码缺省值
  5. 解决Android拍照保存在系统相册不显示的问题
  6. Python 第七篇:socket编程
  7. 解决:configure: error: Missing Xext.h, maybe to install libxext-dev packages?
  8. 代码整洁读书笔记---序,前言,代码猴子
  9. 人工智能生物学深度解析,附源代码
  10. 用C++编程求两个数字的最大公因数和最小公倍数
  11. 苹果id可以彻底注销吗_如何注销苹果id账号
  12. eclipse使用的常见问题
  13. 史上最全! 全球 22 种开源商业收入模式
  14. 计算机音乐谱子 追光者,岑宁儿《追光者》简谱
  15. python漫画爬虫:我不做人了,b站!爬取辉夜大小姐等漫画
  16. 盛夏来临,数据中心如何应对
  17. 代理arp 无故arp 反向arp
  18. Go的安装及环境变量的配置
  19. 抄代码对自己编程提高有用吗?
  20. 《最高人民法院最高人民检察院关于办理组织考试作弊等刑事案件适用法律若干问题的解释》

热门文章

  1. 开发技巧(3-1)Eclipse查找关键字
  2. vim模板插件vim-template的使用
  3. hibernate简单应用
  4. jQuery Unveil – 另一款非常轻量的延迟加载插件
  5. 软件测试基础知识(三)
  6. 职业生涯中最致命的十二中想法
  7. windows 7/2008系统字体变成黑体解决
  8. JAVA可以用来开放游戏吗?
  9. 不仅是人类的shooow
  10. Windows 2000缓冲区溢出入门