题解 | #牛群Z字型排列#
牛群Z字型排列
https://www.nowcoder.com/practice/50ddaf50c6954600a9f1dbb099d6f388
知识点:二叉树,层序遍历
不同于以往的层序遍历,这道题目要求以Z字型进行元素的遍历,我们可以使用一个标记flag,每隔一层将每层得到的元素进行反转,即可得到Z字型排列的效果。具体来说,我们还是像普通的层序遍历一样,获得每层的元素后,我们进行判定,若为双数层,则将list进行反转,再加入到最终结果中。
Java题解如下
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return int整型二维数组 */ public int[][] ZLevelOrder (TreeNode root) { // write code here if(root == null) { return new int[0][0]; } List<List<Integer>> list = new ArrayList<>(); Deque<TreeNode> queue = new ArrayDeque<>(); queue.offer(root); boolean flag = false; while(!queue.isEmpty()) { int size = queue.size(); List<Integer> tmp = new ArrayList<>(); for(int i = 0; i < size; i++) { TreeNode poll = queue.poll(); tmp.add(poll.val); if(poll.left != null) queue.offer(poll.left); if(poll.right != null) queue.offer(poll.right); } if(flag) { Collections.reverse(tmp); } list.add(tmp); flag = !flag; } int[][] res = new int[list.size()][]; for(int i = 0; i < list.size(); i++) { res[i] = new int[list.get(i).size()]; for(int j = 0; j < res[i].length; j++) { res[i][j] = list.get(i).get(j); } } return res; } }