107.Binary Tree Level Order Traversal II

題目連接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     }
View Code

層序遍歷的另外一種寫法,即一層層的一塊兒遍歷,看上去是兩層循環,其實每一個結點只遍歷了一遍。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     }
View Code

法二: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     }
View Code
相關文章
相關標籤/搜索