429. N 叉树的层序遍历

难度:中等

目录

一、问题描述

二、解题思路

1、思路

三、解题

1、代码实现

2、时间复杂度 and 空间复杂度


一、问题描述

这里直接采用LeetCode上面的问题描述。

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

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

下面给出示例:

提示:

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

二、解题思路

1、思路

        由于是层次遍历,因此首先想到的是使用 BFS(广度优先搜索) 来实现对每一层的一个节点进行记录,并且保存进容器中。这里 需要设置一个容器保存每一层的节点 记为 nums ,需要一个保存每一层节点的容器 记为 ans ,也就是需要返回的容器。

        由于需要保存所有层的节点,所以我们需要统计目前层数的节点数目,这里使用 layers 统计目前层数一共有多少个节点,若当前层的节点都已经保存在 nums 中,然后将 nums 存储在 ans 中并且,清空 nums 继续保存下一层的节点。

        layers 初始值为 q.size() 也就是当前层数,每次遍历层次节点后 layers 都要进行减减操作 ,这样当 nums 0 的时候即可将 nums 的所有结点 也就是当前层的所有结点保存在 ans 中,并且更新 layers 也就是下一层有多少结点 为 q.size()

        执行完 BFS 后,ans中保存所有层的结点。

三、解题

1、代码实现

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        if(!root){
            return {};
        }
        //保存答案
        vector<vector<int>> ans;
        ans.push_back({root->val});
        queue<Node*> q;
        q.emplace(root);
        //存储每一层的全部结点
        vector<int> nums;
        // 保存当前层的结点个数
        int layers = q.size();
        while(!q.empty()){
            Node* temp = q.front();
            q.pop();
            //遍历该结点的所有子节点 并入队,且将结点保存进 nums 中
            for(int i = 0; i < temp->children.size(); i++){
                q.emplace(temp->children[i]);
                nums.push_back(temp->children[i]->val);
            }
            layers--;
            // 当前层结点为 0 后 将该层的所有结点保存进 答案中 并更新下一层的节点数目
            if(layers == 0){
                layers = q.size();
                ans.push_back(nums);
                nums.clear();
            }
        }
        //这里需要去掉最后保存的一个 空数组
        ans.pop_back();
        return ans;
    }
};

 

2、时间复杂度 and 空间复杂度

时间复杂度:O(n)

空间复杂度:O(n) 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Alkaid_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值