这是悦乐书的第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循环,将其添加进队列中,在下一轮循环时再从队列中取出。

  1. // Definition for a Node.
  2. class Node {
  3. public int val;
  4. public List<Node> children;
  5. public Node() {}
  6. public Node(int _val,List<Node> _children) {
  7. val = _val;
  8. children = _children;
  9. }
  10. }
  11. class Solution {
  12. public List<List<Integer>> levelOrder(Node root) {
  13. List<List<Integer>> result = new ArrayList<>();
  14. if (root == null) {
  15. return result;
  16. }
  17. Queue<Node> queue = new LinkedList<Node>();
  18. queue.offer(root);
  19. while (!queue.isEmpty()) {
  20. List<Integer> current = new ArrayList<>();
  21. int length = queue.size();
  22. for (int i=0; i<length; i++) {
  23. Node curr = queue.poll();
  24. current.add(curr.val);
  25. for (Node n : curr.children) {
  26. queue.offer(n);
  27. }
  28. }
  29. result.add(current);
  30. }
  31. return result;
  32. }
  33. }

03 第二种解法

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

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

  1. // Definition for a Node.
  2. class Node {
  3. public int val;
  4. public List<Node> children;
  5. public Node() {}
  6. public Node(int _val,List<Node> _children) {
  7. val = _val;
  8. children = _children;
  9. }
  10. }
  11. class Solution {
  12. public List<List<Integer>> levelOrder(Node root) {
  13. List<List<Integer>> result = new ArrayList<>();
  14. levelOrder(root, result, 0);
  15. return result;
  16. }
  17. public void levelOrder(Node root, List<List<Integer>> result, int level) {
  18. if (root == null) {
  19. return ;
  20. }
  21. if (result.size() == level) {
  22. result.add(new ArrayList<>());
  23. }
  24. List<Integer> list = result.get(level);
  25. list.add(root.val);
  26. for (Node n : root.children) {
  27. levelOrder(n, result, level+1);
  28. }
  29. }
  30. }

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. python理解描述符(descriptor)

    Descriptor基础 python中的描述符可以用来定义触发自动执行的代码,它像是一个对象属性操作(访问.赋值.删除)的代理类一样.前面介绍过的property是描述符的一种. 大致流程是这样的: ...

  2. Oracle 如何开启归档模式

    Oracle开启归档 场景:某所的数据库没有开启归档,如何开启归档模式的文档. 1.查看oracle归档状态 SQL> archive log list; 数据库日志模式 非存档模式 //目前不 ...

  3. CSRF跨站伪造请求

    一.什么是CSRF CSRF(Cross Site Request Forgery) 跨站请求伪造.也被称为One Click Attack和Session Riding,通常缩写为CSRF或XSRF ...

  4. WebSocket+Java 私聊、群聊实例

    前言 之前写毕业设计的时候就想加上聊天系统,当时已经用ajax长轮询实现了一个(还不懂什么是轮询机制的,猛戳这里:https://www.cnblogs.com/hoojo/p/longPolling ...

  5. FormCollection collection 使用

    参考文档:https://www.cnblogs.com/dare/p/9173479.html

  6. 线程 线程池 Task

    首先声明 这是读了 愉悦的绅士 文章 <菜鸟之旅——学习线程(线程和线程池)> <Task与线程> 的一些个人总结,还是那句话,如有不对,欢迎指正 文章以代码加注释的方法展示. ...

  7. JS基础(三)构造函数

    JS中的构造函数 <script language="JavaScript"> window.onload = function(){ function Bottle( ...

  8. 浏览器解析JavaScript原理

    1.浏览器解析JavaScript原理特点: 1.跨平台 2.弱类型 javascript 定义的时候不需要定义数据类型,数据类型是根据变量值来确定的.    var a = 10; 数字类型    ...

  9. JavaScript解析机制与闭包原理实例详解

    js代码解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字; 2.用var定义的变量 ...

  10. @RequestMapping 详解

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapping注解有六个属性,下面我们把她分 ...