二叉树的层次遍历
问题的提出
描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是:[[3],[9,20],[15,7]]。
提示:0 <= 二叉树的结点数 <= 1500
示例1
输入:
{1,2}
返回值:
[[1],[2]]
示例2
输入:
{1,2,3,4,#,#,5}
返回值:
[[1],[2,3],[4,5]]
基本分析
主要思路:广度优先
如下图所示:一层一层的遍历二叉树,
1、遍历到一个节点,将左右个孩子加入队列;
2、一次遍历二叉树的一层;
3、怎么确定能遍历一层:每次遍历队列,先记录队列的大小size,出队size次,这些值即为一层,存入res数组,并通过1、2将下一层的节点存入队列;
对示例1模拟前序遍历,如下图所示(来自牛客网):
算法流程
-
维护一个队列,队列保存每一层所有结点
-
list集合收集当前层的所有结点的值
-
遍历所有每一层,从队列中取出当前层所有结点,并收集结果到集合
-
左右节点按顺序加到队尾
具体实现
package com.bugchen.niuke.excirse.tree;
/**
* 描述
* 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
* 例如:
* 给定的二叉树是{3,9,20,#,#,15,7}
*
* @Author:BugChen
* @Description:二叉树的层次遍历
* @Date:2021-11-23
*/
import java.util.ArrayList;
import java.util.LinkedList;
/**
* 算法流程:
* 维护一个队列,队列保存每一层所有结点
* list集合收集当前层的所有结点的值
* 遍历所有每一层,从队列中取出当前层所有结点,并收集结果到集合
* 左右节点按顺序加到队尾
*/
public class LeverIterator {
static class TreeNode {
int value;
TreeNode left;
TreeNode right;
TreeNode(int value) {
this.value = value;
this.left = null;
this.right = null;
}
}
/**
* @param root TreeNode类
* @return int整型ArrayList<ArrayList <>>
*/
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
//如果根节点为空,直接返回一个空的结果集
if (root == null) return result;
//维护一个队列,用来存储二叉树每一层的节点
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
//先让根节点root入队,此时root相当于是第一层的所有节点
queue.offer(root);
//只要队列不为空,就出队,因为队列维护的是每一个层的节点数目
while (!queue.isEmpty()) {
//用来存储每层节点的节点值
ArrayList<Integer> list = new ArrayList<>();
int count = queue.size();
while (count-- > 0) {
TreeNode tempNode = queue.poll();
list.add(tempNode.value);
//出队之后,将该节点左右节点按照顺序入队
if (tempNode.left != null) {
queue.offer(tempNode.left);
}
if (tempNode.right != null) {
queue.offer(tempNode.right);
}
}
//将遍历到的结果存储到结果集中
result.add(list);
}
return result;
}
public static void main(String[] args) {
//构造一颗二叉树
TreeNode node1 = new TreeNode(3);
TreeNode node2 = new TreeNode(9);
TreeNode node3 = new TreeNode(20);
TreeNode node4 = new TreeNode(15);
TreeNode node5 = new TreeNode(7);
node1.left = node2;
node1.right = node3;
node3.left = node4;
node3.right = node5;
LeverIterator li = new LeverIterator();
System.out.println(li.levelOrder(node1).toString());
}
}