题解 | #牛群Z字型排列#
牛群Z字型排列
https://www.nowcoder.com/practice/50ddaf50c6954600a9f1dbb099d6f388
在常规的层序遍历的基础上做一下改进:
第一层的元素按照从左到右的顺序添加进数组当中,第二层的元素按照从右到左的顺序添加进数组。
我们定义一个变量记录当前循环的次数,如果循环次数是偶数,那么就是要按照从右到左的顺序添加元素。
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) { List<int []> res = new ArrayList<>(); if(root == null) return new int[0][0]; Deque<TreeNode> deque = new LinkedList<>(); deque.offer(root); int count = 0; // 用于控制集合中的元素是否反转,如果是偶数,那么当前的子集反转即可。 int index = 0; while(!deque.isEmpty()){ count++; int size = deque.size(); int arr[] = new int[size]; // 如果是偶数次循环,那么从右到左将当前的元素添加进数组中 index = count % 2 == 0 ? arr.length - 1 : 0; for(int i=0;i<size;i++){ TreeNode node = deque.poll(); if(count % 2 == 0) arr[index--] = node.val; else arr[index++] = node.val; if(node.left!=null) deque.offer(node.left); if(node.right!=null) deque.offer(node.right); } // 收集结果 res.add(arr); } // 将 res 转换位数组 return res.toArray(new int[0][]); } }