这是悦乐书的第225次更新,第238篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第92题(顺位题号是429)。给定n-ary树,返回其节点值的级别顺序遍历。(即,从左到右,逐级)。例如,给定一个3-ary树:



我们应该返回它的级别顺序遍历:

[[1],[3,2,4][5,6]]

注意:

  • 树的深度最多为1000。

  • 节点总数最多为5000。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用广度优先算法(BFS),一级一级,从左往右遍历,对此我们借助队列来实现。

特殊情况:当root为null时,直接返回一个没有任何元素的list。

正常情况:先将root放入队列,然后开始循环,最外层循环,我们新建一个list,存入每一级的元素,第二层循环开始处理队列中上一轮被添加进去的node,依次poll出来,将其val存入外层循环新建的list中,而其另一个属性children,因为是一个以node为元素的数组,所以在此使用for-each循环,将其添加进队列中,在下一轮循环时再从队列中取出。

// Definition for a Node.
class Node {
public int val;
public List<Node> children; public Node() {} public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
} class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<Node> queue = new LinkedList<Node>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> current = new ArrayList<>();
int length = queue.size();
for (int i=0; i<length; i++) {
Node curr = queue.poll();
current.add(curr.val);
for (Node n : curr.children) {
queue.offer(n);
}
}
result.add(current);
}
return result;
}
}

03 第二种解法

使用深度优先算法(DFS),此方法就需要使用递归来操作了。

在树的每一级,都可以看做是当前问题的子问题,因此我们将数组、根节点、层级这三个要素作为递归的条件。在递归方法中,如果当前节点为null,直接return;如果当前result的大小和层级相等,就往result新加一个list,然后从result中取出当前层级对应的数组,先将当前节点值添加进去,然后for-each遍历其children,每一个children都符合当前问题的描述,在此调用方法自身,但是第三个参数层级需要往上加1,因为进入了当前节点的下一层级。

// Definition for a Node.
class Node {
public int val;
public List<Node> children; public Node() {} public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
} class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<>();
levelOrder(root, result, 0);
return result;
} public void levelOrder(Node root, List<List<Integer>> result, int level) {
if (root == null) {
return ;
}
if (result.size() == level) {
result.add(new ArrayList<>());
}
List<Integer> list = result.get(level);
list.add(root.val);
for (Node n : root.children) {
levelOrder(n, result, level+1);
}
}
}

04 小结

算法专题目前已连续日更超过两个月,算法题文章92+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)的更多相关文章

  1. LeetCode(107) Binary Tree Level Order Traversal II

    题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...

  2. LeetCode之“树”:Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal 题目链接 题目要求: Given a binary tree, return the level order traversal o ...

  3. [刷题] 102 Binary Tree Level Order Traversal

    要求 对二叉树进行层序遍历 实现 返回结果为双重向量,对应树的每层元素 队列的每个元素是一个pair对,存树节点和其所在的层信息 1 Definition for a binary tree node ...

  4. lettcode-102:Binary Tree Level Order Traversal (Java)

    Binary Tree Level Order Traversal 二叉树的层序遍历 两种方式: 1.用两个queue交替表示每一层的节点 2.用两个node,一个表示当前层的最后一个节点,一个表示下 ...

  5. 【leetcode刷题笔记】Binary Tree Level Order Traversal(JAVA)

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. leetcode 102 Binary Tree Level Order Traversal ----- java

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  7. LeetCode(26)-Binary Tree Level Order Traversal II

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  8. [LeetCode&Python] Problem 107. Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  9. [LeetCode&Python] Problem 429. N-ary Tree Level Order Traversal

    Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  10. LeetCode(102) Binary Tree Level Order Traversal

    题目 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to rig ...

随机推荐

  1. 数据可视化 seaborn绘图(2)

    统计关系可视化 最常用的关系可视化的函数是relplot seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, data=N ...

  2. 第一册:lesson thirty one。

    原文:Where is Sally? A:Where is .. B? B:She is in the garden,A. A:What's she doing? B:She is sitting u ...

  3. Tomcat服务器为java项目配置顶级域名

    修改端口, Tomcat服务器下conf/server.xml文件      把端口号更改为80 解释:输入域名时默认进入80端口,如果没修改则需要输入端口号才能进入. Eg:www.xxx.com: ...

  4. JSTL_Core标记库

    一.   说明 如有转载,请标明出处 本博讲解JSTL中的core库 对标记属性进行介绍时,首先介绍必写的属性,然后带有默认值的属性,其次是其余属性,这三类属性中间用空行隔开 二:core标记库库 C ...

  5. 3. mysql性能分析

    一.mysql query optimizer 1. mysql 中有专门负责优化 select 语句的优化器模块,主要功能:通过计算分析系统中收集的统计信息,为客户端的 Query 提供他认为最优的 ...

  6. JVM运行时数据区内容简述

    JVM运行时数据区分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆.方法区.如下图所示,五部分其中又分为线程共享区域和线程私有区域,下面将分别介绍每一部分. 1. PC程序计数器 程序计数器是一块较 ...

  7. 【转】AtomicReference与volatile的区别

    来源:AtomicReference与volatile的区别 AtomicReference与volatile的在可见性上的意义是一致的. volatile不能保证原子性,AutomicReferen ...

  8. 读书笔记--Android Gradle权威指南(上)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...

  9. angular 过滤器(日期转换,时间转换,数据转换等)

    (function() { 'use strict'; /** * myApp Module * * Description */ angular.module('myApp') .filter('i ...

  10. svn checkout 实用小技巧

    svn checkout 实用小技巧 by:授客 QQ:1033553122   问题描述: 用svn小乌龟软件,进行update,commit之前,先要把svn工作目录checkout到本地,那么问 ...