標籤:數組 題目 輸出 lin null roo 個數 i++ return
一、題目
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); }
103. Binary Tree Zigzag Level Order Traversal