1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. /**
  5. * Source : https://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
  6. *
  7. *
  8. * Given a binary tree, return the zigzag level order traversal of its nodes' values.
  9. * (ie, from left to right, then right to left for the next level and alternate between).
  10. *
  11. * For example:
  12. * Given binary tree {3,9,20,#,#,15,7},
  13. *
  14. * 3
  15. * / \
  16. * 9 20
  17. * / \
  18. * 15 7
  19. *
  20. * return its zigzag level order traversal as:
  21. *
  22. * [
  23. * [3],
  24. * [20,9],
  25. * [15,7]
  26. * ]
  27. */
  28. public class BinaryTreeZigzagLevelOrderTraversal {
  29. /**
  30. *
  31. * 按层次输出树,两层之间要首尾相接
  32. *
  33. * 类似之前那个binarytree level order traversal,使用两个list来完成
  34. * 只需要在添加子节点的时候判断是否需要倒序即可
  35. * 如果需要的话则先添加右子节点,再添加左子节点
  36. *
  37. * @param root
  38. * @return
  39. */
  40. public List<List<Integer>> zigzagOrder (TreeNode root) {
  41. List<List<Integer>> result = new ArrayList<List<Integer>>();
  42. if (root == null) {
  43. return result;
  44. }
  45. List<TreeNode> curList = new ArrayList<TreeNode>();
  46. List<TreeNode> nextList = new ArrayList<TreeNode>();
  47. curList.add(root);
  48. boolean isReverse = true;
  49. while (curList.size() > 0) {
  50. List<Integer> list = new ArrayList<Integer>();
  51. for (int i = 0; i < curList.size(); i++) {
  52. TreeNode node = curList.get(i);
  53. if (node == null) {
  54. continue;
  55. }
  56. list.add(node.value);
  57. if (isReverse) {
  58. nextList.add(node.rightChild);
  59. nextList.add(node.leftChild);
  60. } else {
  61. nextList.add(node.leftChild);
  62. nextList.add(node.rightChild);
  63. }
  64. }
  65. if (list.size() > 0) {
  66. result.add(list);
  67. }
  68. curList.clear();
  69. curList.addAll(nextList);
  70. nextList.clear();
  71. isReverse = !isReverse;
  72. }
  73. return result;
  74. }
  75. public static void print (List<List<Integer>> lists) {
  76. StringBuffer buffer = new StringBuffer();
  77. buffer.append("[\n");
  78. for (int i = 0; i < lists.size(); i++) {
  79. buffer.append(Arrays.toString(lists.get(i).toArray(new Integer[lists.get(i).size()])));
  80. buffer.append(",\n");
  81. }
  82. if (lists.size() > 0) {
  83. buffer.deleteCharAt(buffer.length()-2);
  84. }
  85. buffer.append("]");
  86. System.out.println(buffer.toString());
  87. }
  88. public TreeNode createTree (char[] treeArr) {
  89. TreeNode[] tree = new TreeNode[treeArr.length];
  90. for (int i = 0; i < treeArr.length; i++) {
  91. if (treeArr[i] == '#') {
  92. tree[i] = null;
  93. continue;
  94. }
  95. tree[i] = new TreeNode(treeArr[i]-'0');
  96. }
  97. int pos = 0;
  98. for (int i = 0; i < treeArr.length && pos < treeArr.length-1; i++) {
  99. if (tree[i] != null) {
  100. tree[i].leftChild = tree[++pos];
  101. if (pos < treeArr.length-1) {
  102. tree[i].rightChild = tree[++pos];
  103. }
  104. }
  105. }
  106. return tree[0];
  107. }
  108. private class LevelNode {
  109. TreeNode node;
  110. int level;
  111. public LevelNode(TreeNode node, int level) {
  112. this.node = node;
  113. this.level = level;
  114. }
  115. }
  116. private class TreeNode {
  117. TreeNode leftChild;
  118. TreeNode rightChild;
  119. int value;
  120. public TreeNode(int value) {
  121. this.value = value;
  122. }
  123. public TreeNode() {
  124. }
  125. }
  126. public static void main(String[] args) {
  127. BinaryTreeZigzagLevelOrderTraversal traversal = new BinaryTreeZigzagLevelOrderTraversal();
  128. char[] arr = new char[]{'3','9','2','#','#','1','7'};
  129. TreeNode tree = traversal.createTree(arr);
  130. print(traversal.zigzagOrder(tree));
  131. }
  132. }

leetcode — binary-tree-zigzag-level-order-traversal的更多相关文章

  1. [LeetCode] 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]Binary Tree Zigzag Level Order Traversal @ Python

    原题地址:http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ 题意: Given a binary tr ...

  3. [LeetCode] Binary Tree Zigzag Level Order Traversal

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

  4. LeetCode :: Binary Tree Zigzag Level Order Traversal [tree, BFS]

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

  5. [Leetcode] 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 (swift) 二叉树Z字形层次遍历

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

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

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

  8. 【LeetCode】 Binary Tree Zigzag Level Order Traversal 解题报告

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

  9. 【leetcode】Binary Tree Zigzag Level Order Traversal

    Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...

  10. Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树

    题目描述: Binary Tree Zigzag Level Order Traversal AC Rate: 399/1474 My Submissions Given a binary tree, ...

随机推荐

  1. MyBatis(九) 使用association定义单个对象的封装规则

    (1)接口中编写方法 public Emp getEmpandDept(); (2)编写Mapper文件 <resultMap type="com.eu.bean.Emp" ...

  2. jquery for循环

    第一种: for(var i=0,len=$len.length; i<len; i++){//alert($len.eq(i).html());$zongshu=$zongshu+$len.e ...

  3. 匿名函数 javascript

    匿名函数: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  4. cf 744D

    一开始没看懂题解,想了好久(一整天)才想明白是枚举弦上点二分半径check角度,看了下clj的代码发现思路都一样就开始写了. 借鉴了一下clj的代码. 调了一个多小时. 几个注意点:看到好多 rand ...

  5. CSS-单位em 和 rem

    1,em单位(css3新增单位) em:就是一种长度单位,它是参照当前元素的字号,如果没有设置,就参照父容器,一直到浏览器的默认字号大小 em 是相对长度单位(参照父元素),其参照当前元素字号大小,如 ...

  6. 2019_BUAAOO_第二单元总结

    第一次作业:单部多线程傻瓜调度电梯 设计策略 本次作业我才用的是生产者消费者模式,创建一个RequestList类,将输入线程InputThread作为生产者,负责将请求放入RequestList:将 ...

  7. 三、糖醋鲤鱼(Sweet and sour carp)

    糖醋鲤鱼是用鲤鱼制作的一道山东济南传统名菜,为鲁菜的代表菜品之一 ,色泽金黄,外焦内嫩,酸甜可口,香鲜味美. 菜品历史 <诗经>载:岂食其鱼,必河之鲤.<济南府志>上早有&qu ...

  8. [tkinter]Radiobutton单选按钮的使用

    首先因为单选按钮有一个特性(一个被选中后,自动清除其它按钮的选中状态) 所以使用方式也有点不同 错误示例 from tkinter import * root = Tk() r1 = Radiobut ...

  9. mantisbt的配置与安装

    下载并安装wampserver; 安装时,提示SMTP服务器时,应正确填写邮箱的SMTP的服务器地址: 安装完成后,登录phpMyAdmin; 给原有的root用户创建密码,所有root用户: 创建一 ...

  10. CoreProfiler升级到.NetStandard 2.0

    致所有感兴趣的朋友: CoreProfiler和相应的Sample项目cross-app-profiling-demo都已经升级到.NetStandrard 2.0和.NetCore 2.0. 有任何 ...