蓝桥与力扣刷题(102 二叉树的层序遍历)

题目:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

蓝桥与力扣刷题(102 二叉树的层序遍历)_第1张图片

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

解题思路+代码:

蓝桥与力扣刷题(102 二叉树的层序遍历)_第2张图片

蓝桥与力扣刷题(102 二叉树的层序遍历)_第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> levelOrder(TreeNode root) {
        /**
        思路:层序遍历(广度优先搜索-BFS)
        1.判断根节点是否为空,是则返回空列表
        2.创建bfs方法,使用队列来层序遍历每一层的叶节点
         */

        if(root == null){
            return new ArrayList<>(); 
        }

        return bfs(root);
    }

    //创建bfs方法
    public List> bfs(TreeNode node){
        //创建列表存放输出的数据
        List> res = new ArrayList<>();
        // 使用队列实现广度优先搜索
        Queue queue = new LinkedList<>();
        queue.offer(node);//将根节点加入队列

        while(!queue.isEmpty()){
            //当前节点的数量
            int levelSize = queue.size(); 
            //创建列表存储每层叶节点的值
            List currentLevel = new ArrayList<>();

            for(int i = 0; i < levelSize; i++){
                //声明队列中弹出的当前节点
                TreeNode currentNode = queue.poll();
                currentLevel.add(currentNode.val);

            //判断当前节点是否有左子节点,加入队列
            if(currentNode.left != null){
                queue.offer(currentNode.left);
            }

            if(currentNode.right != null){
                queue.offer(currentNode.right);
                }
            }
            res.add(currentLevel);
        }
        return res;
    }
}

总结:题目是求二叉树的层序遍历,就已经告诉我们要解答这道题是需要使用广度优先搜索BFS,逐层遍历。在解答这道题时,我们可以使用队列来存放当前层的数据。那么,我们如何知道当前是二叉树的哪一层呢?在每次循环开始时,记录队列的大小(levelSize)。levelSize的大小表示当前层的节点数量。有了这个信息,我们就可以逐个处理当前层的所有节点,并将它们的叶节点加入队列,以便在下一次循环中处理下一层。除了存储节点本身,也可以在队列中存储每个节点的层级信息。这样可以直接知道每个节点属于树的哪一层。

你可能感兴趣的:(leetcode,算法,数据结构,学习方法)