首先不知道java中bfs用什么数据结构,知道用queue之后,不知道queue怎么实现。
java中一般使用
Queue queueA = new LinkedList(); Queue queueB = new PriorityQueue();
来实现queue,常用linkedlist来实现没有优先级的,即单纯的fifo.
记得看queue的讲解,里面有两套function,分别对应
offer peek poll都是带返回值的。
其次要注意while里面控制每层node个数的,就是queue中现在有几个node,记得要先获取num
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue <TreeNode> que = new LinkedList<TreeNode>();
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if ( root == null)
return ans;
que.offer(root);
while (!que.isEmpty()){
int num = que.size();
List <Integer> list = new ArrayList<Integer>();
for ( int i = 0; i < num; i ++ ){
if ( que.peek().left != null )
que.offer(que.peek().left);
if ( que.peek().right != null )
que.offer(que.peek().right);
list.add( que.poll().val);
}
ans.add(list);
}
return ans;
}
}
递归的方法:
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> list = new LinkedList<List<Integer>>();
addLevel(list, 0, root);
return list;
}
private void addLevel(LinkedList<List<Integer>> list, int level, TreeNode node) {
if (node == null) return;
if (list.size()-1 < level) list.addFirst(new LinkedList<Integer>());
list.get(list.size()-1-level).add(node.val);
addLevel(list, level+1, node.left);
addLevel(list, level+1, node.right);
}