二叉树的层次遍历

这篇博客介绍了如何使用广度优先搜索进行二叉树的层次遍历。通过维护一个队列,从根节点开始,逐层收集节点值,将左右子节点按顺序入队,直至队列为空。示例展示了如何遍历给定的二叉树,并给出了具体的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的层次遍历
问题的提出

描述

给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{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模拟前序遍历,如下图所示(来自牛客网):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEUu98qf-1637667985246)(C:\Users\皮皮小陈\AppData\Roaming\Typora\typora-user-images\image-20211123143024269.png)]

算法流程
  • 维护一个队列,队列保存每一层所有结点

  • 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());
    }
}
测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugChen之边角料

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值