題目連接node
題目大意:給出一個二叉樹的層序遍歷,返回層序遍歷按層從底到頂的遍歷結果。ide
法一:層序遍歷。一層層的放進list中,待遍歷完畢,再從尾到頭複製到另外一個list中並返回,代碼以下(耗時5ms):spa
1 private static List<List<Integer>> levelOrderBottom(TreeNode root) { 2 if(root == null) { 3 return new LinkedList<List<Integer>>(); 4 } 5 List<List<Integer>> listOrder = new LinkedList<List<Integer>>(); 6 Queue<TreeNode> queue = new LinkedList<TreeNode>(); 7 queue.offer(root); 8 //記錄每層的結點個數 9 int cnt = 1; 10 List<Integer> listLevel = new LinkedList<Integer>(); 11 while(!queue.isEmpty()) { 12 TreeNode node = queue.poll(); 13 listLevel.add(node.val); 14 cnt--; 15 if(node.left != null) { 16 queue.offer(node.left); 17 } 18 if(node.right != null) { 19 queue.offer(node.right); 20 } 21 if(cnt == 0) { 22 listOrder.add(listLevel); 23 cnt = queue.size(); 24 listLevel = new LinkedList<Integer>(); 25 } 26 } 27 //將list翻轉返回 28 List<List<Integer>> listRes = new LinkedList<List<Integer>>(); 29 int length = listOrder.size(); 30 for(int i = length - 1; i >= 0; i--) { 31 listRes.add(listOrder.get(i)); 32 } 33 return listRes; 34 }
層序遍歷的另外一種寫法,即一層層的一塊兒遍歷,看上去是兩層循環,其實每一個結點只遍歷了一遍。list.add(0,in),將in插入到list的頭部。代碼以下(耗時2ms):code
1 private static List<List<Integer>> levelOrderBottom(TreeNode root) { 2 List<List<Integer>> listOrder = new LinkedList<List<Integer>>(); 3 if(root == null) { 4 return listOrder; 5 } 6 Queue<TreeNode> q = new LinkedList<TreeNode>(); 7 q.offer(root); 8 while(!q.isEmpty()) { 9 int len = q.size(); 10 List<Integer> listIn = new LinkedList<Integer>(); 11 //一層一塊兒遍歷 12 for(int i = 0; i < len; i++) { 13 TreeNode tmp = q.poll(); 14 if(tmp.left != null) { 15 q.offer(tmp.left); 16 } 17 if(tmp.right != null) { 18 q.offer(tmp.right); 19 } 20 listIn.add(tmp.val); 21 } 22 //因爲是鏈表List,因此下面的方法至關於頭插,在第0號位置插入元素 23 listOrder.add(0, listIn); 24 } 25 return listOrder; 26 }
法二:DFS。很特別的一種解法,邊遍歷結點,邊記錄結點的深度,採用後序遍歷。代碼以下(耗時3ms):blog
1 private static List<List<Integer>> levelOrderBottom(TreeNode root) { 2 List<List<Integer>> res = new LinkedList<List<Integer>>(); 3 levelDFS(res, root, 0); 4 return res; 5 } 6 //後序遍歷 7 private static void levelDFS(List<List<Integer>> list, TreeNode root, int level) { 8 if(root == null) { 9 return; 10 } 11 //若是層數大於當前list的大小,則擴充list大小 12 if(level >= list.size()) { 13 list.add(0, new LinkedList<Integer>()); 14 } 15 levelDFS(list, root.left, level + 1); 16 levelDFS(list, root.right, level + 1); 17 //因爲是倒序輸出,因此這裏要-level-1,以將倒數幾層安排到正數幾層進行輸出 18 list.get(list.size() - level - 1).add(root.val); 19 }