栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

二叉树的层次遍历

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树的层次遍历

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

描述

给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{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;



import java.util.ArrayList;
import java.util.linkedList;


public class LeverIterator {
    static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;

        TreeNode(int value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
    }

    
    public ArrayList> levelOrder(TreeNode root) {
        ArrayList> result = new ArrayList<>();
        //如果根节点为空,直接返回一个空的结果集
        if (root == null) return result;
        //维护一个队列,用来存储二叉树每一层的节点
        linkedList queue = new linkedList();
        //先让根节点root入队,此时root相当于是第一层的所有节点
        queue.offer(root);
        //只要队列不为空,就出队,因为队列维护的是每一个层的节点数目
        while (!queue.isEmpty()) {
            //用来存储每层节点的节点值
            ArrayList 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());
    }
}
测试结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591048.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号