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. Jquery Table 操作

    获取行号 var rowIndex = $("#TableId").find("tr").index($("#RowId")[0]); va ...

  2. 利用烧鹅制作简单BadUSB,插谁谁怀孕

    所用硬件设备为烧鹅,烧鹅是RadioWar基于Teensy++ 2.0 AT90USB1286芯片设计的USB Rubber Ducky类开发板. 使用veil编码meterpreter生成paylo ...

  3. 动态规划 算法(DP)

    多阶段决策过程(multistep decision process)是指这样一类特殊的活动过程,过程可以按时间顺序分解成若干个相互联系的阶段,在每一个阶段都需要做出决策,全部过程的决策是一个决策序列 ...

  4. 前App Store高管揭秘:关于“苹果推荐”的七大真相

    相信你已经看过很多这样那样关于如何获得苹果商店推荐的攻略了,但其实很多人依然陷入了很大的误区.前不久采访了前App Store团队高管Greg Essig,向各位开发者揭示关于获得苹果推荐的真相. 在 ...

  5. 一、什么是WPF?

    一.什么是WPF? Windows Presentation Foundation(以前的代号为“Avalon”)是 Microsoft 用于 Windows 的统一显示子系统,它通过 WinFX 公 ...

  6. WCF之多个终结点

    1.服务端配置如下(一个Service节点下可有多个endpoint,): <system.serviceModel> <services> <service name= ...

  7. magento日常使用

    magento order number长度(修改)设置 2013年3月15日星期五 Asia/Shanghai上午10时22分02秒 1-进入要修改的该网站的数据库:2-找到表名:eav_entit ...

  8. magento十大免费插件

    10. 自定义分层导航风格URL:http://www.magentocommerce.com/magento-connect/custom-layered-navigation-style.html ...

  9. LeetCode Pow(x, n) (水题)

    题意: 求浮点型x的n次幂结果. 思路: logN直接求,注意n可能为负数!!!当n=-2147483648的时候,千万别直接n=-n,这样的结果是多少?其他求法大同小异. class Solutio ...

  10. Core Java Volume I — 3.6. Strings

    3.6. StringsConceptually, Java strings are sequences of Unicode characters(Java的字符串是一个Unicode序列). Fo ...