![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8b0f67c1cb5ec835e09674af41de8e8d.png)
层序遍历
如果我们想要按照从上往下,从左往右的顺序依次输出这个二叉树(输出结果为1 2 3 4 5 6 7 ),我们可以采用什么方法?
实现思路
想要顺序遍历整个二叉树,我们便需要顺序,从左往右,顺序访问二叉树的每个结点。也就是从根结点1开始,到左结点(2),再到右结点(3)。再访问2的左右结点,3的左右结点…
建立模型
经过上面的思考,我们可以总结出一个规律:不同层间,上层(根)结点访问优先级大于其左右结点;同层间,左结点优先级大于右结点。 然后,按照优先级的先后依次访问,并输出结果。由于是按照优先级顺序依次访问,所以我们选择队列来实现这一过程。
递归遍历
代码实现:
/**
* 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) {
List<List<Integer>> res=new ArrayList<>();
levelOrder(root,res,1);
return res;
}
private void levelOrder(TreeNode node,List<List<Integer>> res,int deep){
if(node==null) return;
//List<Integer> cur=new ArrayList<>();
if(deep>res.size()){
res.add(new ArrayList<Integer>());
}
res.get(deep-1).add(node.val);
levelOrder(node.left,res,deep+1);
levelOrder(node.right,res,deep+1);
}
}
迭代遍历(非递归)
/**
* 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) {
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
List<Integer> list=new ArrayList<>();
int len=queue.size();
while(len>0){
TreeNode cur=queue.poll();
list.add(cur.val);
if(cur.left!=null) queue.offer(cur.left);
if(cur.right!=null) queue.offer(cur.right);
len--;
}
res.add(new ArrayList<>(list));
}
return res;
}
}