具体地,我们首先把根节点 root 放入队列中,随后在广度优先搜索的每一轮中,我们首先记录下当前队列中包含的节点个数(记为 cnt),即表示上一层的节点个数。在这之后,我们从队列中依次取出节点,直到取出了上一层的全部 cnt 个节点为止。当取出节点 cur 时,我们将 cur 的值放入一个临时列表,再将 cur 的所有子节点全部放入队列中。
while (!q.empty()) { int cnt = q.size(); vector<int> level; for (int i = 0; i < cnt; ++i) { Node* cur = q.front(); q.pop(); level.push_back(cur->val); for (Node* child: cur->children) { q.push(child); } } ans.push_back(move(level)); }
publicclassSolution { public IList<IList<int>> LevelOrder(Node root) { if (root == null) { returnnew List<IList<int>>(); }
IList<IList<int>> ans = new List<IList<int>>(); Queue<Node> queue = new Queue<Node>(); queue.Enqueue(root);
while (queue.Count > 0) { int cnt = queue.Count; IList<int> level = new List<int>(); for (int i = 0; i < cnt; ++i) { Node cur = queue.Dequeue(); level.Add(cur.val); foreach (Node child in cur.children) { queue.Enqueue(child); } } ans.Add(level); }
while q: cnt = len(q) level = list() for _ inrange(cnt): cur = q.popleft() level.append(cur.val) for child in cur.children: q.append(child) ans.append(level)