这是悦乐书的第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. awk知识点总结

    find+xargs+grep+sed+awk系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 0.学习资料推荐 1.awk入门:看视频.找 ...

  2. Perl回调函数和闭包

    在Perl中,子程序的引用常用来做回调函数(callback).闭包(closure),特别是匿名子程序. 回调函数(callback) 关于什么是回调函数,见一文搞懂:词法作用域.动态作用域.回调函 ...

  3. Redis Cluster集群架构实现(四)--技术流ken

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...

  4. Linux命令-基本变量类型及其运算

    [root@Redis01 ~]# cd /install/[root@Redis01 install]# mkdir -p test && cd test -s修改时间:[root@ ...

  5. linux安装配置zookeeper-3.4.10

    此文是基于上一篇文章:hadoop集群搭建 安装zookeeper: [在各个slave节点安装zookeeper] 下载地址:http://mirror.bit.edu.cn/apache/zook ...

  6. [JavaScript] 前端模块加载简单实现(require)

    模块加载的简单实现 (function(win) { var baseUrl; var paths; var script_cache = {}; var script_queue = []; var ...

  7. ElasticSearch集群环境搭建

    一 .单机部署 1.下载安装包.解压 2.在window下运行bin/elasticsearch.bat 3.访问localhost:9200 页面显示结果 { "name" : ...

  8. Java并发(一)—— 使用多线程

    Java的线程机制是抢占式的,所谓的抢占式指的是每一个线程都会被分配一个指定大小的时间片,一旦这个时间片用完,就会通过上下文切换到另一个线程上去. 并发是主要是为了提高单处理器的性能.创建一个线程会有 ...

  9. 【Java每日一题】20170323

    20170322问题解析请点击今日问题下方的“[Java每日一题]20170323”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  10. SpringBoot 配置静态资源映射

    SpringBoot 配置静态资源映射 (嵌入式servlet容器)先决知识 request.getSession().getServletContext().getRealPath("/& ...