ZBLOG

if (root == NULL) { return {}; } vector ans; queue q; q.push(root); while (!q.empty()) { vector vals; for (int n = q.size(); n--;) { ...

这段代码是用来进行二叉树的层次遍历(也称为广度优先遍历),并将每一层的节点值存储在一个二维向量中。下面逐步解释代码的每个部分:

1. 检查根节点是否为空

if (root == NULL) {
    return {};
}
  • 目的:如果给定的二叉树的根节点为空,返回一个空的二维向量。即,如果树不存在,则没有任何值需要遍历。

2. 初始化结果存储和队列

vector<vector<int>> ans;
queue<TreeNode*> q;
q.push(root);
  • ans:这是一个二维向量,用于存储最终的结果,每个内层向量保存一层的节点值。
  • q:使用一个队列来帮助实现广度优先遍历。我们将根节点推入队列,以便开始遍历。

3. 开始循环直到队列为空

while (!q.empty()) {
    vector<int> vals;
  • 当队列不为空时,我们进入循环。在这个循环中,我们会处理当前层所有节点。
  • vals:初始化一个临时向量,用于存储当前层所有节点的值。

4. 遍历当前层所有节点

for (int n = q.size(); n--;) {
    auto node = q.front();
    q.pop();
    vals.push_back(node->val);
  • for (int n = q.size(); n--; ):这个循环运行当前队列中的元素数量,表示这一层有多少个节点需要处理。
  • node = q.front():获取队列中的第一个元素(即当前正在处理的节点)。
  • q.pop():从队列中移除该节点。
  • vals.push_back(node->val):将当前节点的值添加到 vals 向量中。

5. 将子节点加入队列

if (node->left)
    q.push(node->left);
if (node->right)
    q.push(node->right);
  • 如果当前节点有左子树(即 node->left 不为 NULL),则将左子树推入队列。
  • 如果当前节点有右子树(即 node->right 不为 NULL),则将右子树推入队列。这确保下一次迭代时能够访问到这一层的下一层级别。

6. 将当前层结果添加到最终结果中

ans.emplace_back(vals);
  • 在完成对当前层所有节点的处理后,将 vals 向量(代表这一层的所有值)添加到最终答案 ans 中。

7. 返回结果

return ans;
  • 循环结束后,所有级别的数据都已被收集到 ans 中,此时返回它。

总结:

这段代码有效地利用了队列实现了二叉树的广度优先遍历,并以嵌套向量形式返回各级别的数据结构,使得对二叉树每一层进行操作变得简单且直观。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20802

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?