描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{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()); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)