![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> levelOrder(TreeNode root) {
List> result = new ArrayList>();
if (root == null)
return result;
Queue q = new LinkedList();
Queue qSon = new LinkedList();
q.add(root);
ArrayList sample = new ArrayList();
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();
q = qSon;
qSon = new LinkedList();
}
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> levelOrder(TreeNode root) {
List> output = new ArrayList>();
if (root == null)
return output;
Queue queue = new LinkedList();
queue.add(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
List list = new ArrayList();
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> levelOrder(TreeNode root) {
ArrayList> ret = new ArrayList>();
if (root == null)
return ret;
Queue q = new LinkedList();
q.offer(root);
while (!q.isEmpty()) {
int levelSize = q.size();
ArrayList group = new ArrayList();
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> levelOrder(TreeNode root) {
List> ret = new ArrayList>();
if (root == null) {
return ret;
}
Queue q = new LinkedList();
q.offer(root);
while (!q.isEmpty()) {
int size = q.size();
List list = new ArrayList();
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> levelOrder(TreeNode root) {
List> ret = new ArrayList>();
if (root == null) {
return ret;
}
helper(root, 0, ret);
return ret;
}
private void helper(TreeNode root, int level, List> ret) {
if (root == null) {
return;
}
if (level > ret.size() - 1) {
ret.add(new ArrayList());
}
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