算法日常・每日刷题--<队列,宽搜>1
429. N 叉树的层序遍历 - 力扣(LeetCode)429. N 叉树的层序遍历 - 给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。 示例 1:[https://assets.leetcode.com/uploads/2018/10/12/narytreeexample.png]输入:root = [1,null,3,2,4,null,5,6]输出:[[1],[3,2,4],[5,6]]示例 2:[https://assets.leetcode.com/uploads/2019/11/08/sample_4_964.png]输入: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, 104] 之间https://leetcode.cn/problems/n-ary-tree-level-order-traversal/
题目描述
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔。
解题思路
本质:BFS 广度优先搜索,队列实现层序遍历
- 二叉树层序遍历我们每次只压入左、右孩子;N 叉树一个节点可以有多个子节点,直接遍历
children数组,把所有子节点全部入队列。 - 利用队列的特性,每一轮循环开始,记录当前队列大小
sz,sz就是当前这一层节点的总个数。 - 循环
sz次:逐个取出本层节点,保存节点值,再把它所有子节点入队。一轮结束,就收集完一整层结果。 - 将每层结果存入最终二维数组,直到队列为空遍历结束。
/* // 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) { vector<vector<int>>ret; queue<Node*> q; int n=0; if(root==nullptr) return ret; q.push(root); n++; while(q.size()) { int sz=q.size(); vector<int> tmp; for(int i=0;i<sz;i++) { Node*t =q.front(); q.pop(); tmp.push_back(t->val); for(auto child:t->children) { if(child!=nullptr) { q.push(child); } } } ret.push_back(tmp); } return ret; } };