二叉树的层次遍历
Posted 码农历险技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的层次遍历相关的知识,希望对你有一定的参考价值。
算法刷不停,刷刷刷。
题目:
这里要求的是二叉树按层输出数据,流程为:
从根节点出发,输出根节点;
再遍历根节点周围的两个左右子树,输出根节点的左右子树;
再遍历左右子树的左右子树,输出左右子树的左右子树;
..........
通过过程可以看出,二叉树的层次遍历本质上就是广度优先遍历,我们可以借助队列来辅助。
1.先把根节点加入列队;
2.队列不为空,就把这个节点加入结果集中,再把这个节点的左右子树加入队列中;
3.重复步骤2
public class CengCiBianLi {
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}public List<List<Integer>>
levelOrder(TreeNode root) {
List<List<Integer>> result=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
if(root==null) return result;
//先把根节点放进去队列
queue.add(root);
while(!queue.isEmpty()){
List<Integer> list=new ArrayList<>();
//遍历队列
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode temp=queue.poll();
list.add(temp.val);
if(temp.left!=null){
queue.add(temp.left);
}
if(temp.right!=null){
queue.add(temp.right);
}
}
result.add(list);
}
return result;
}
}
一开始写遍历队列的时候写成了这样。。结果提交一直错误。
写惯了ArrayList,所以写了这种写法,结果半天还想不通,懵逼了,其实这个queue.size()大小一直变的,因为下面执行了queue.poll()出队操作导致长度也变了。
LeeCode运行结果:
顺便把另一道题也解决了:
这道题跟上面那一道很像,只是每一层的顺序反了过来,我们直接把队列遍历的结果反顺序加入结果集中就可以了。
代码差不多:
public class CengCiBianLi1 {
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}public List<List<Integer>>
levelOrderBottom(TreeNode root) {
List<List<Integer>> result=new LinkedList<>();
Queue<TreeNode> queue=new LinkedList<>();
if(root==null) return result;
//把根节点放进去队列
queue.offer(root);
//遍历队列
while(!queue.isEmpty()){
List<Integer> list=new LinkedList<>();
//开始遍历队列
int size=queue.size();
for(int i=0;i<size;i++){
TreeNode temp=queue.poll();
if(temp!=null){
list.add(temp.val);
queue.offer(temp.left);
queue.offer(temp.right);
}
}
if(list.size()>0){
result.add(0,list);
}
}
return result;
}
}
LeeCode运行结果:
以上是关于二叉树的层次遍历的主要内容,如果未能解决你的问题,请参考以下文章
python-leetcode102-树的宽度遍历二叉树的层次遍历