题意:
题解:
涉及到java中的队列的知识点
队列先进先出
能达到 左结点先进 ,左结点先出,顺序上就是从左到右
java中队列的定义
Queue<> queue=new LinkedList<>();
本质上是一个链表+数组
方法:
添加 queue.add() 当容器满了 无法添加 会报异常
添加 queue.offer() 当容器满了 不会报异常 只会返回false
移除队首 queue.remove() 移除第队首元素 如果为空 为报异常
移除+返回队首 queue.poll() 移除队首元素 并可以返回队首元素 如果为空 不会报异常 会返回一个null
返回队首 queue.peek();
判断是否为空 queue.isEmpty()
查询队首并不删除 queue.element();
代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//广度优先遍历
//利用 队列
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
TreeNode tem;
List<Integer> list;
int count;
while(!queue.isEmpty()){
count=queue.size();
list=new ArrayList<>();
while(count>0){
tem=queue.peek();//弹出 队首元素
queue.remove();
//将tem结点孩子结点压入 队列
if(tem.left!=null) queue.add(tem.left);
if(tem.right!=null) queue.add(tem.right);
--count;
list.add(tem.val);
}
res.add(list);
}
return res;
}
}
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> res=new LinkedList<>();
if(root==null) return res;
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
int count=0;
TreeNode node;
while(!queue.isEmpty()){
List<Integer> list=new ArrayList<>();
count=queue.size();
for(int i=0;i<count;i++){
node=queue.poll();//和remove类似 返回一个队首元素
//为空时返回null
list.add(node.val);
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
res.addFirst(list);//每次新增 将 前面的往后移
}
return res;
}
}
LinkedList是双向链表
随机增删效率高,但对某一元素的检索效率低,但有get(i)可以对某一位置进行检索效率可以
ArrayList数组
检索效率高,中间位置增删效率低 首位增删效率高