说道遍历二叉树,我们很容易就会想到按照前序中序后序以及按层来遍历二叉树。
这篇博客主要是记录一下按层来遍历二叉树的方法。
这个二叉树按照层来遍历的结果是
二叉树的遍历方法中,很多人最先想到的就是用递归的方法进行遍历。二叉树按层遍历也同样可以使用递归的方法进行遍历,这种方法有两个要点:1.要记录当前遍历的层数 2.每次递归的过程中判断该层是否已经遍历过
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
上面是二叉树的结构定义。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//定义一个存放结果的数据结构
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
//用来记录层数的计数器
int count = 0;
levelOrder(root,res,count);
return res;
}
public void levelOrder(TreeNode root,List<List<Integer>> res,int count) {
//如果遍历的这个节点是空的则不需要操作和记录
if (null == root) {
return;
}
List<Integer> list;
if (count >= res.size()) {//如果是没有遍历过的层,则创建新的List存放节点
list = new ArrayList<Integer>();
//把这个新建的List放入存放结果的数据结构中
res.add(list);
} else {//如果是正在遍历的层则从结果集中取出存放这层节点的List
list = res.get(count);
}
//将节点的值放入List
list.add(root.val);
//递归地继续去按照从左至右的遍历节点的下一层
levelOrder(root.left,res,count+1);
levelOrder(root.right,res,count+1);
}
}
按层遍历二叉树还可以借助队列来完成。这个方法的重点是每次将正在遍历的节点从队列中取出,并节点左右子树放入队列。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (null == root) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
//记录遍历层的节点的数量
int count = queue.size();
List<Integer> list = new ArrayList<>();
while (count > 0) {
//将节点从队列中取出
TreeNode temp = queue.poll();
list.add(temp.val);
//如果节点存在左右子树,则将左右子树放入队列中
if (null != temp.left) {
queue.add(temp.left);
}
if (null != temp.right) {
queue.add(temp.right);
}
//完成该节点的遍历,则计数器-1
count--;
}
res.add(list);
}
return res;
}
}