刷这道题时十分上火,因为我层专门做过二叉树的题,那时候感觉自己理解的很不错。几个月过去了,我全都不记得了。为什么记忆力这么差呢?????????????????????
二叉树的遍历分为
1.深度优先搜索 dfs 递归,这个是非常常用的,先中后序遍历用它
2、广度,bfs ,这个应用在层序搜索中,也就是一个队列。
所以层序遍历要用到队列,先来一个普通的层序遍历输出一个集合
public List<Integer> bianLi(TreeNode head){
Queue<TreeNode> que=new LinkedList<>();
List<Integer> list=new ArrayList<>();
que.add(head);
while(que.size()!=0){
TreeNode node=que.remove();
list.add(node.val);
if(node.left!=null)que.add(node.left);
if(node.right!=null)que.add(node.right);
}
return list;
}
没有测试,但是应该是对的。
但是题目要求要分出层,那便让这一层都入队列,再出队列。
还没出队列之前队列的长度就是每一层的长度(一开始要固定住),这个for循环让这一层的每一个节点出队列,然后把它的子节点加入队列,那么加入的就是新的一层。这样新循环里队列的长度就又变了。
理解起来有点乱呢。
public List<List<Integer>> levelOrder(TreeNode root) {
//二叉树的层序遍历,用队列,存它的每一层。
List<List<Integer>> list=new ArrayList<>();
Queue<TreeNode> que=new LinkedList<>();
if (root != null) {
que.add(root);
}
//一个for循环就是一层
while(que.size()!=0){
int n=que.size();
List<Integer> list2=new ArrayList<>();
//每一层;
for(int i=0;i<n;i++){
TreeNode node=que.remove();
list2.add(node.val);
if(node.left!=null){
que.add(node.left);
}
if(node.right!=null){
que.add(node.right);
}
}
list.add(list2);
}
return list;
}
在每一次for循环里会把那一层全取出来,下一层全入队列,所以下一次的队列长依然是层长啦。