31.二叉树的层次遍历_中

本文详细介绍了一种解决二叉树层次遍历问题的方法,并通过广度优先搜索的原理进行了解释。文中提供了完整的实现代码,帮助读者理解如何逐层访问二叉树的所有节点。

一、题目描述

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

在这里插入图片描述

二、解题思路

先来补充知识,数据结构中的广度优先搜索,这里给出详细的搜索过程,方便大家学习。

先来给一个节点图,
在这里插入图片描述
广度优先搜索详细步骤:

第一步:我们从顶点A开始,A的未访问节点有BED三个顶点,首先访问A的第一个未访问顶点,然后访问A的第二个未访问顶点,再访问A的第三个未访问顶点,这是的搜索顺序是A——B——E——D

第二步:由于B是在E和D之前被访问的,接下来首先访问B的未访问邻节点,是C;这是再访问E的邻节点,E的未访问邻节点是G,访问G;最后再来访问D的邻接未访问节点,但由于D的邻接节点G已经访问过了,不再访问,此时搜索顺序更新为了A——B——E——D——C——G

第三步:这是按照顺序,我们应该访问节点C的邻接点了,因为C在D之后,G之前,而D的邻节点在第二步已经访问过啦,此时C的邻节点只有F访问F。然后访问G的邻接节点,访问H;此时在更新搜索顺序:

A——B——E——D——C——G——F——H

第四步:由于F在H之前被访问故接下来访问F的未访问邻节点,但是F没有未访问的邻节点,所以直接考虑在F之后被访问的节点H,即接下来应访问H的未访问的邻节点,所以访问I。

最后得到访问序列(搜索顺序):A——B——E——D——C——G——F——H——I

有没有层层遍历的感觉呢?

对应到二叉树的层次遍历中

给定一颗二叉树,输出它的层次遍历来看看。
在这里插入图片描述
层次遍历结果是:1-2-3-4-5-6-7-8-9

是不是发现可以使用广度优先搜索来解决二叉树的层次遍历。

三、代码演示

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //这个集合用来存放最终的结果集
        List<List<Integer>> reList = new ArrayList<>();

        if(root == null){
            return reList;
        }

        //声明的这个队列是用来为每一个节点做判断用的,判断该节点是否存在左右子树,并存储他们
        LinkedList<TreeNode> queue = new LinkedList<>();
        //将根节点加入到队列中
        queue.add(root);

        //此时遍历队列,直到队列为空
        while(!queue.isEmpty()){
            //用于存放当前这一层的所有节点值的集合
            List<Integer> curLevelNode = new ArrayList<>();

            //获取当前层的节点数量,节点数量为当前队列的长度
            int curLevelNum = queue.size();
            //将当前层的节点依次出队
            for(int i=0; i<curLevelNum; i++){
                //队列中元素出队,声明一个变量存储每次出队的节点
                TreeNode curNode = queue.removeFirst();
                //将这个每次出队的值放到上面声明的curLevelNode集合中
                curLevelNode.add(curNode.val);

                //判断每次出队列的这个值的左右子树,如果存在将其左右子树排在队列后面,进入下一轮循环
                if(curNode.left != null){
                    queue.add(curNode.left);
                }
                if(curNode.right != null){
                    queue.add(curNode.right);
                }
            }
            //一次for循环遍历一层的节点,遍历完之后将其加入到最终结果集合中
            reList.add(curLevelNode);
        }
    return reList;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值