二叉树的层次遍历

二叉树的层次遍历,第1张

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

描述

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5596433.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存