LeetCode 0429.N 叉树的层序遍历:广度优先搜索(BFS)

news/2024/6/29 12:02:22 标签: leetcode, 宽度优先, 算法,

【LetMeFly】429.N 叉的层序遍历:广度优先搜索(BFS)

力扣题目链接:https://leetcode.cn/problems/n-ary-tree-level-order-traversal/

给定一个 N 叉,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

 

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

 

提示:

  • 的高度不会超过 1000
  • 的节点总数在 [0, 10^4] 之间

方法一:广度优先搜索(BFS)

和之前二叉的广度优先搜索一样,我们可以使用一个队列来存放每一层的节点,再让这些节点依次出队,并将节点的孩子们(如有)入队。

  • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是节点个数
  • 空间复杂度 O ( N 2 ) O(N2) O(N2),其中 N 2 N2 N2是节点最多的一层的节点数

AC代码

C++
class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> ans;
        queue<Node*> q;
        if (root) {
            q.push(root);
        }
        while (q.size()) {
            ans.push_back({});
            for (int _ = q.size(); _ > 0; _--) {
                Node* thisNode = q.front();
                q.pop();
                ans.back().push_back(thisNode->val);
                for (Node* nextNode : thisNode->children) {
                    q.push(nextNode);
                }
            }
        }
        return ans;
    }
};
Python
# from typing import List, Optional

# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children

class Solution:
    def levelOrder(self, root: Optional[Node]) -> List[List[int]]:
        ans = []
        q = []
        if root:
            q.append(root)
        while q:
            ans.append([])
            for _ in range(len(q)):
                thisNode = q[0]
                q = q[1:]
                ans[-1].append(thisNode.val)
                for nextNode in thisNode.children:
                    q.append(nextNode)
        return ans

针对于Python的语法糖,若使用两个数组可以很大程度上减少代码量(甚至提高效率):

# from typing import Optional, List

# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children

class Solution:
    def levelOrder(self, root: Optional[Node]) -> List[List[int]]:
        ans = []
        a = []
        if root:
            a.append(root)
        while a:
            ans.append([thisNode.val for thisNode in a])
            a = [nextChild for thisNode in a for nextChild in thisNode.children]
        return ans

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/136136336


http://www.niftyadmin.cn/n/5385558.html

相关文章

【工具】Ubuntu开机黑屏、NVIDIA显卡驱动问题

重装显卡驱动导致开机黑屏 联想 P720 工作站&#xff0c;更新NVIDIA Quadro RTX5000 显卡驱动&#xff0c;重启后黑屏。 开机后待显示Lenovo后按下ESC&#xff0c; 进入Ubuntu 设置&#xff0c;按下E键&#xff0c;用箭头移动光标改参数 ro quiet splash $vt_handoff 改为 rw …

CSS中伪元素和伪类的区别和作用?

伪元素&#xff1a;在内容元素的前后插入额外的元素或样式&#xff0c;但是这些元素实际上并不在文档中生成。它们只在外部显示可见&#xff0c;但不会在文档的源代码中找到它们&#xff0c;因此&#xff0c;称为“伪”元素。例如&#xff1a; p::before {content:"第一章…

力扣 面试题 05.06. 整数转换

思路&#xff1a; 牵扯到二进制数&#xff0c;基本上要考虑位运算符&#xff0c;相关知识可以见http://t.csdnimg.cn/fzts7 之前做过类似的题目&#xff0c;大致思路就是先用按位异或^找出不同位&#xff0c;再用n&&#xff08;n-1&#xff09;计算出不同位的个数&#x…

顺序表详解(SeqList)

本文使用C语言进行顺序表的代码实现。 博主将使用代码和相关知识相结合的方式进行讲解&#xff0c;简单易懂&#xff0c;懵懂的大学生一听就会~ 顺序表是一种线性表的存储结构&#xff0c;它将数据元素存储在一段连续的存储空间中&#xff0c;每个元素占据一个存储单元&#x…

【Go】五、Grpc 的入门使用

grpc 与 protobuf grpc 使用的是 protobuf 协议&#xff0c;其是一个通用的 rpc 框架&#xff0c;基本支持主流的所有语言、其底层使用 http/2 进行网络通信&#xff0c;具有较高的效率 protobuf 是一种序列化格式&#xff0c;这种格式具有 序列化以及解码速度快&#xff08;…

windows胖爪装机

在安装自己需要的系统的时候我们是需要制作系统启动盘的,可是很多小伙伴不会制作系统启动盘,那么我们应该如何安全、快速、稳定的制作U盘呐?今天小编就以胖爪装机大师为例为大家带来了制作u盘启动盘的具体操作方法,希望对大家有所帮助。 具体操作步骤如下: 1.首先打开胖…

编程笔记 Golang基础 009 标识符和关键字

编程笔记 Golang基础 009 标识符和关键字 一、标识符二、标识符分类&#xff08;一&#xff09;空白标识符&#xff08;又称下划线 _&#xff09;&#xff08;二&#xff09;预声明标识符&#xff08;三&#xff09;唯一标识符&#xff08;四&#xff09;导出标识符 三、关键字…

【算法学习】搜索算法之深度优先搜索

深度优先搜索 DFS 1.算法介绍 深度优先搜索(DFS)算法是一种用于遍历或搜索树或图的算法。它的基本思想是尽可能深地搜索图的分支,直到到达叶节点或无法再深入为止,然后回溯到前一个节点,继续探索其他分支。这种搜索策略可以确保图中的每个节点都被访问到,除非它是一个环。…