Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree [3,9,20,null,null,15,7],

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

return its zigzag level order traversal as:

  1. [
  2. [3],
  3. [20,9],
  4. [15,7]
  5. ]

和上一题很类似,只不过输出的时候,需要“之”字形输出。

可以在上一层答案的基础上。对偶数层进行反转。

第一次用了两个队列,实现了,但比较慢。

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11. public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
  12.  
  13. List list = new ArrayList<List<Integer>>();
  14. if( root == null)
  15. return list;
  16. Deque<TreeNode> queue = new LinkedList<TreeNode>();
  17. Deque<TreeNode> queue1 = new LinkedList<TreeNode>();
  18. queue.add(root);
  19. int dir = 0;
  20. while( !queue.isEmpty() ){
  21. List ans = new ArrayList<Integer>();
  22. int size = queue.size();
  23. for( int i = 0;i<size;i++){
  24. TreeNode node = null;
  25. if( dir == 0)
  26. node = queue.poll();
  27. else
  28. node = queue.pollLast();
  29. ans.add(node.val);
  30. if( dir == 0){
  31. if( node.left != null)
  32. queue1.add(node.left);
  33. if( node.right != null)
  34. queue1.add(node.right);
  35. }else{
  36. if( node.right != null)
  37. queue1.addFirst(node.right);
  38. if( node.left != null)
  39. queue1.addFirst(node.left);
  40. }
  41. }
  42. list.add(ans);
  43. queue.addAll(queue1);
  44. queue1.clear();
  45. dir = (dir == 1?0:1);
  46. }
  47.  
  48. return list;
  49.  
  50. }
  51. }

但是优点在于不用递归和回溯

使用递归/回溯,速度和代码都会得到优化。

  1. public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
  2. List<List<Integer>> res = new ArrayList<>();
  3. helper(res, root, 1);
  4. for (int i = 0; i < res.size(); i++)
  5. if (i % 2 == 1)
  6. Collections.reverse(res.get(i));
  7. return res;
  8. }
  9. private void helper(List<List<Integer>> res, TreeNode node, int level){
  10. if (node == null) return;
  11. if (res.size() < level) res.add(new ArrayList<Integer>());
  12. res.get(level-1).add(node.val);
  13. helper(res, node.left, level+1);
  14. helper(res, node.right, level+1);
  15. }

leetcode 103 Binary Tree Zigzag Level Order Traversal ----- java的更多相关文章

  1. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  2. [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树来回遍历

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  3. [LeetCode] 103. Binary Tree Zigzag Level Order Traversal _ Medium tag: BFS

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  4. Java for LeetCode 103 Binary Tree Zigzag Level Order Traversal

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  5. leetCode 103.Binary Tree Zigzag Level Order Traversal (二叉树Z字形水平序) 解题思路和方法

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. [leetcode] 103 Binary Tree Zigzag Level Order Traversal (Medium)

    原题链接 题目要求以"Z"字型遍历二叉树,并存储在二维数组里. 利用BFS,对每一层进行遍历.对于每一层是从左还是从右,用一个整数型判断当前是偶数行还是奇数行就可以了. class ...

  7. Leetcode#103 Binary Tree Zigzag Level Order Traversal

    原题地址 基本数据结构操作,二叉树的层次遍历. 代码: vector<vector<int> > zigzagLevelOrder(TreeNode *root) { vect ...

  8. [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树Z字形层序遍历

    相对于102题,稍微改变下方法就行 迭代方法: 在102题的基础上,加上一个变量来判断是不是需要反转 反转的话,当前list在for循环结束后用collection的反转方法就可以实现反转 递归方法: ...

  9. leetCode :103. Binary Tree Zigzag Level Order Traversal (swift) 二叉树Z字形层次遍历

    // 103. Binary Tree Zigzag Level Order Traversal // https://leetcode.com/problems/binary-tree-zigzag ...

随机推荐

  1. FCKEditor文件上传提示信息的汉化

    FCKEditor文件上传提示信息的汉化在FCKeditor中,虽然可以自动监测客户端语言,但是仍有小部分信息未能得到汉化.例如上传图片.Flash时,上传成功和上传失败的对话框提示信息均为英文,只要 ...

  2. [安卓]The Google Android Stack

  3. Android中 服务里的方法抽取成接口

    1 写个类继承Service 重写 onBind方法 返回一个IBinder 对象(传递到连接成功时用) 2 服务中 写一个内部类 继承IBinder 并且实现一个接口(用于抽取方法)继承IBinde ...

  4. Line计划今年全面进军中国市场:建立本地团队

    北京时间6月13日下午消息,<华尔街日报>报道称,移动消息应用Line计划于今年晚些时候进军中国市场.Line将在中国建立本地团队,开发内容和功能,从而进一步开拓中国这一全球最大的移动市场 ...

  5. 安装xampp后,遇到的各种问题

    一.apache无法启动 1.查看端口是否被占用 80端口冲突,解决方法:打开目录C:\xampp\apache\conf(我的安装目录为C:\xampp)下的httpd.conf文件,将Listen ...

  6. JDK的下载与安装

    一.下载 在Oracle公司的官方网站(www.oracle.com)下载. 二.安装 1.双击运行JDK程序,弹出JDK安装导向窗口,点击“下一步” 2.点击“更改",将安装地址修改为 C ...

  7. 《day13--异常的进阶和包的使用》

    //101-finally的使用&102-finally的使用场景 /* 需求:有一些特定的代码,无论异常是否发生,都需要执行, 因为异常会引发程序的跳转,导致有些语句执行不到,无法满足这个需 ...

  8. hdu1878 欧拉回路

    //Accepted 1240 KB 250 ms //水题 欧拉回路 //连通+节点度均为偶数 #include <cstdio> #include <cstring> #i ...

  9. PED结构获取进程路径和命令行地址

    1.FS寄存器 2.进入FS寄存器地址,7FFDD000 3.偏移30为PED结构 4.偏移地址10 3C,44偏移:路径地址,命令行地址 // 通过PEB结构去查找所有进程模块 void *PEB ...

  10. Image Generator (Image Builder)

    如果你想要下载一个预编译好的镜像文件,或者想要尝试整个编译过程,一个替代方案是使用镜像生成器(Image Generator)(以前被叫做Image Builder).这是一个预编译好的OpenWrt ...