![Upload Paste_Image.png failed. Please try again.]
My code:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null)
return result;
Queue<TreeNode> q = new LinkedList<TreeNode>();
Queue<TreeNode> qSon = new LinkedList<TreeNode>();
q.add(root);
ArrayList<Integer> sample = new ArrayList<Integer>();
while(!q.isEmpty()) {
TreeNode temp = q.poll();
sample.add(temp.val);
if (q.isEmpty()) {
if (temp.left != null)
qSon.add(temp.left);
if (temp.right != null)
qSon.add(temp.right);
result.add(sample);
sample = new ArrayList<Integer>();
q = qSon;
qSon = new LinkedList<TreeNode>();
}
else {
if (temp.left != null)
qSon.add(temp.left);
if (temp.right != null)
qSon.add(temp.right);
}
}
return result;
}
}
My test result:
這道題目還可以,有一點小難度。主要就是,二叉樹如果層級遍歷。
level traversal
那么就是新建一個queue,然后把子孫往里面放就行了。然后就能遍歷。
但是這道題目不是遍歷,而是把一層層的東西存入List。
那么就有個問題,如果有一個queue,無法體現出層與層之間的界限。所以,我用了兩個queue。
一個用來存放這一層的樹結點,然后一個個存入 List中。一個用來存放下一層的子結點,然后當上一層q空時,代表上一層遍歷已經結束了。然后立馬讓上一層的queue指向下一層,下一層的queue則立馬重新申請一塊內存。以此循環。
差不多就這樣吧。
PS: 剛剛聽了同學的思路,感覺更好,只需要使用一個queue。設置一個level size。
import java.util.*;
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> output = new ArrayList<List<Integer>>();
if (root == null)
return output;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
List<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < levelSize; i++) {
TreeNode n = queue.poll();
list.add(n.val);
if(n.left != null)
queue.add(n.left);
if(n.right != null)
queue.add(n.right);
}
output.add(list);
}
return output;
}
}
更加簡潔!
**
總結:Queue, level traversal
**
Anyway, Good luck, Richardo!
My code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
ArrayList<List<Integer>> ret = new ArrayList<List<Integer>>();
if (root == null)
return ret;
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
while (!q.isEmpty()) {
int levelSize = q.size();
ArrayList<Integer> group = new ArrayList<Integer>();
for (int i = 0; i < levelSize; i++) {
TreeNode temp = q.poll();
group.add(temp.val);
if (temp.left != null)
q.offer(temp.left);
if (temp.right != null)
q.offer(temp.right);
}
ret.add(group);
}
return ret;
}
}
簡單題目。
Anyway, Good luck, Richardo!
My code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (root == null) {
return ret;
}
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
while (!q.isEmpty()) {
int size = q.size();
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
TreeNode node = q.poll();
list.add(node.val);
if (node.left != null) {
q.offer(node.left);
}
if (node.right != null) {
q.offer(node.right);
}
}
ret.add(list);
}
return ret;
}
}
簡單題。做完今天十道題目的任務就完成了。
Anyway, Good luck, Richardo! -- 08/29/2016
沒想到還有一種 recursion的方法:
My code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if (root == null) {
return ret;
}
helper(root, 0, ret);
return ret;
}
private void helper(TreeNode root, int level, List<List<Integer>> ret) {
if (root == null) {
return;
}
if (level > ret.size() - 1) {
ret.add(new ArrayList<Integer>());
}
ret.get(level).add(root.val);
helper(root.left, level + 1, ret);
helper(root.right, level + 1, ret);
}
}
也很簡潔。
這讓我想起了一道題目。
就是樹節點還有第三個指針next,把左邊的鏈接到右邊。
也是可以用recursion做的。
iteration就是dfs,因為問題就是要我們解決每一層的關系,所以BFS是最直接的想法。
dfs的話,如果原來的狀態都保存在那里,等到下一次再次回到這一層的時候,就可以繼續用了。
也就是說,即使下去了下,再回來,一切都還未變,該怎樣還可以怎樣。
這兩道題目都是這個特征。
Anyway, Good luck,Richardo! -- 09/06/2016