二叉树的层次遍历

简介: 层次遍历就是即逐层地,从左到右访问所有节点

1、层次遍历

       层次遍历就是即逐层地,从左到右访问所有节点。如下

2、方法实现思路

      对于层序遍历,无疑是一层一层结点查找。那我们能不能找一个队列,把每一层的结点依次放入队列中,这样我们就能实现程序遍历啦。

       首先创建一个队列,然后把根节点放入队列中。

       接着就把 queue 的头结点弹出,也就是A,放到 cur中去,并打印。此时 cur 指向 A结点

cur 设置的目的:方便我们把下一层结点结点放到队列当中。

队列特点: 先进先出。

  我们判断 cur 的左结点是否为空,如果不为空就把左结点放入队列中。同时我们也要判断cur的右节点,操做相同。

每弹出一个结点,就会把该节点的左右孩子插入到队列中(左右孩子不为空的情况下!),然后弹出队列头结点。

       也就是一层一层遍历,比如遍历完B后,把B的左右孩子放到C的后面,直到遍历完C后(第二层)才会遍历B的左右孩子(第三层)。

总结:

定义一个队列,把root根节点放入队列中。      

弹出对头节点,并遍历打印。

判断当前节点的左右孩子是否为null,如果不为null,则入队。

检测队列,如果队列为空,则说明层序遍历结束。

层次遍历对于二叉树来说算是比较基础的一种算法,其拓展了许多。例如判断二叉树是否为满二叉树等。

       大家还可以去做 leetcode 做一下这道题加以巩固:二叉树的层序遍历

3、代码实现

import java.util.Queue;//导入队列的包
public class BinaryTree {
    //内部类
    static class TreeNode {
        public char val;
        public TreeNode left;//左孩子的引用
        public TreeNode right;//右孩子的引用
        public TreeNode(char val) {
            this.val = val;
        }
    }
    /**
     * 创建一棵二叉树 返回这棵树的根节点
     *
     * @return
     */
    public TreeNode createTree() {
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        TreeNode H = new TreeNode('H');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        C.left = F;
        C.right = G;
        E.right = H;
        return A;
    }
    //层序遍历
    void levelOrder(TreeNode root) {
        if(root == null) return;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            System.out.print(cur.val);
            if(cur.left != null){
                queue.offer(cur.left);
            }
            if(cur.right != null){
                queue.offer(cur.right);
            }
        }
    }
    public static void main(String[] args) {
        BinaryTree bt = new BinaryTree();
        TreeNode root = bt.createTree();
        bt.levelOrder(root);
    }
}

代码中树的形状,和代码结果如下

69a302c2f93bee8fc07f6dd60292fb46_68cb7b2798c2400f9fa076e685994715.png

注:

Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

       在使用时我们要导入 import java.util.Queue ;

Queue中的方法:

1681233338ce2ce78e0300e496271d3a_493a7e8b42e94734b3caa2a8f5be56e7.png

相关文章
|
5月前
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
171 0
|
8月前
|
传感器 人工智能 机器人
【01】人形机器人研究试验-被有些网友痛骂“工业垃圾”“人工智障”上春晚的人形AI机器人-宇树科技机器人到底怎么样??-本系列优雅草卓伊凡亲自尝试下人形机器人的制造-从0开始学习并且制作机器人-可以跟随卓伊凡
【01】人形机器人研究试验-被有些网友痛骂“工业垃圾”“人工智障”上春晚的人形AI机器人-宇树科技机器人到底怎么样??-本系列优雅草卓伊凡亲自尝试下人形机器人的制造-从0开始学习并且制作机器人-可以跟随卓伊凡
441 1
【01】人形机器人研究试验-被有些网友痛骂“工业垃圾”“人工智障”上春晚的人形AI机器人-宇树科技机器人到底怎么样??-本系列优雅草卓伊凡亲自尝试下人形机器人的制造-从0开始学习并且制作机器人-可以跟随卓伊凡
|
3月前
|
JSON 缓存 监控
1688商品详情API实时数据解析的示例
1688商品详情API可实时获取商品标题、价格、规格、库存等核心数据。通过商品ID调用接口,支持解析基础信息、SKU规格、卖家与物流详情。提供Python调用示例与完整数据解析逻辑,适用于采购比价、供应商监控等场景,确保数据精准获取与处理。
|
3月前
|
传感器 人工智能 运维
AI驱动的智能设备健康评估系统究竟如何应对企业运维挑战?
AI驱动的智能设备健康评估系统通过人工智能技术实现设备状态的主动监测和预测性维护。该系统由Prompt规则库、评估任务触发机制、Agent执行等核心组件构成,能够自动获取数据、智能分析设备状态并生成可视化报告。相比传统运维方式,系统具有规则灵活定义、低成本集成、高阶智能分析等优势,适用于能耗监测、异常检测、预测性维护等多种工业场景。产品专家三桥君通过详细解析系统工作流程和实际案例,展示了如何帮助企业实现从"事后维护"到"预测性运维"的智能化转型。
167 0
|
10月前
|
机器学习/深度学习 存储 人工智能
《C++ 赋能强化学习:Q - learning 算法的实现之路》
本文探讨了如何用C++实现强化学习中的Q-learning算法。强化学习通过智能体与环境的交互来学习最优策略,Q-learning则通过更新Q函数估计动作回报。C++凭借高效的内存管理和快速执行,在处理大规模数据和复杂计算时表现出色。文章详细介绍了环境建模、Q表初始化、训练循环及策略提取等关键步骤,并分析了其在游戏开发、机器人控制等领域的应用前景,同时指出了可能面临的挑战及应对策略。
306 11
|
机器学习/深度学习 vr&ar
深度学习笔记(十):深度学习评估指标
关于深度学习评估指标的全面介绍,涵盖了专业术语解释、一级和二级指标,以及各种深度学习模型的性能评估方法。
492 0
深度学习笔记(十):深度学习评估指标
|
安全 Java Go
探索Go语言在高并发环境中的优势
在当今的技术环境中,高并发处理能力成为评估编程语言性能的关键因素之一。Go语言(Golang),作为Google开发的一种编程语言,以其独特的并发处理模型和高效的性能赢得了广泛关注。本文将深入探讨Go语言在高并发环境中的优势,尤其是其goroutine和channel机制如何简化并发编程,提升系统的响应速度和稳定性。通过具体的案例分析和性能对比,本文揭示了Go语言在实际应用中的高效性,并为开发者在选择合适技术栈时提供参考。
|
机器学习/深度学习 Shell Linux
DM8一键安装脚本
DM8一键安装脚本
188 2
|
数据中心 网络架构
网络中不同类型网线的特点与应用
【8月更文挑战第24天】
825 0
|
资源调度 API 计算机视觉
【OpenCV】—非线性滤波:中值滤波、双边滤波
【OpenCV】—非线性滤波:中值滤波、双边滤波
296 3