层次遍历简介
广度优先又叫层次遍历,基本过程如下:
层次遍历就是从根节点开始,先访问根节点下面一层全部元素,在访问之后的层次,类似金字塔一样一层一层访问。我们可以看到这里就是从左到右一层一层的遍历二叉树,先访问3,之后再访问1的左右子节点9和20,之后分别访问9和20的左右子节点[8,13]和[15,17],最后得到结果[3,9,20,8,13,15,17]。
这里面对的问题主要是,如何将遍历过的节点的子节点存储起来。例如在访问9时,应当将其子节点8和13存储起来,直到遍历20的时候在进行后续处理。
此问题可以通过队列进行解决。
- 首先3先入队;
- 然后3出队,之后将3的左右子节点9和20保存到队列中;
- 之后9出队,将9的左右子节点8和13入队;
- 之后20出队,将20的左右子节点15和7入队;
- 当所有节点都没有子节点的时候,将8,13,15,7分别出队。
例题:LeetCode102.二叉树的层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
提示:
- 树中节点数目在范围
[0, 2000]
内 -1000 <= Node.val <= 1000
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if(root == null){
return new ArrayList<>();//根节点为空返回空数组;
}
List<List<Integer>> res = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(queue.size()>0){
int n =queue.size();//记录队列中元素的个数,然后一次处理完这一层的n个节点;
List<Integer> level = new ArrayList<Integer>();//用于临时存储每层的节点;
for(int i =0; i<n ;i++){
TreeNode t = queue.remove();//存储出队节点;
if(t.left != null){
queue.add(t.left);
}
if(t.right != null){
queue.add(t.right);
}
level.add(t.val);//将出队节点加到level中;
}
res.add(level);//循环结束后,将level数组加入到res数组中;
}
return res;
}
}
提交结果,通过: