一、题目
1、审题
2、分析
给出一棵二叉树,以“之"字形层序输出二叉树的结点值。
二、解答
1、思路:
方法一、
采用一个队列进行层次遍历,遍历每一层时,将每一层结点放入一个数组,用一个标志 flag 记录向左或向右的访问顺序,并将符合的层次的结点访问顺序记录在 List 中。
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> resultList = new ArrayList<List<Integer>>(); if(root == null) return resultList; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); boolean is_Left2Right = true; while(!queue.isEmpty()) { int size = queue.size(); List<Integer> list = new ArrayList<>(); TreeNode[] arr = new TreeNode[size]; for (int i = 0; i < size; i++) { arr[i] = queue.poll(); if(arr[i].left != null) queue.add(arr[i].left); if(arr[i].right != null) queue.add(arr[i].right); } if(!is_Left2Right) { // 从右向左添加 for (int i = size - 1; i >= 0; i--) list.add(arr[i].val); } else { // 从左向右添加 for (int i = 0; i < size; i++) list.add(arr[i].val); } is_Left2Right = !is_Left2Right; // 换一个方向 resultList.add(list); } return resultList; }
方法二、
采用递归进行层次遍历;
遍历时,若为奇数行,则是从右向左添加元素,若是偶数行,则是从左向右添加元素;
public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> resultList = new ArrayList<List<Integer>>(); if(root == null) return resultList; zigzagHelper(resultList, root, 0); return resultList; } private void zigzagHelper(List<List<Integer>> resultList, TreeNode root, int height) { if(root == null) return; if(height >= resultList.size()) resultList.add(new ArrayList<Integer>()); if(height % 2 == 0) // 0、2、4 resultList.get(height).add(root.val); else resultList.get(height).add(0, root.val); zigzagHelper(resultList, root.left, height+1); zigzagHelper(resultList, root.right, height+1); }