当前位置: 首页 > news >正文

二叉树的层序遍历

一:题目

解释:

①:返回的是一个vector<vector<int>>类型的值,再结合实例可知,返回的是一个vector类型的对象,其每个元素都是一个vector<int>这样的整形数组,每个数组存储的是该层的值

②:示例3中根节点为空 则直接返回vector<vector<int>>类型的对象即可

二:思路

①:核心思路
使用队列:
        队列用于按层存储节点,确保按层遍历。
        每次处理完一层后,队列中剩下的节点就是下一层的节点。

分层处理:
        通过记录当前层的节点数,确保每次只处理当前层的节点。


②:.实现步骤
初始化:
        如果根节点不为空,将其入队,并设置当前层的节点数Leve1Size = 1。

外层循环(按层遍历)∶
        当队列不为空时,继续遍历。
        创建一个数组v,用于存储当前层的节点值。

内层循环(处理当前层):
        遍历当前层的所有节点(由Leve1size控制次数)︰
                取出队头节点cur。
               将cur的值存入v。
                将cur的左右子节点(如果存在)入队。将cur出队。


更新层信息:
         处理完当前层后,更新(LevelSize为队列的当前大小(即下一层的节点数)。
         将当前层的节点值数组√存入结果vv。


返回结果:
        最终返回存储所有层节点值的二维数组vv。

三:代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vv; // 存储最终结果
        queue<TreeNode*> q;     // 辅助队列,用于层序遍历
        int LevelSize = 0;      // 当前层的节点数

        if (root != nullptr) { // 如果根节点不为空
            q.push(root);      // 将根节点入队
            LevelSize = 1;     // 当前层节点数为 1
        }

        while (!q.empty())                 // 当队列不为空时,继续遍历
        {
            vector<int> v;                  // 存储当前层的节点值
            
            while (LevelSize--)            // 遍历当前层的所有节点
            {
                TreeNode* cur = q.front();  // 取出队头节点

                if (cur->left != nullptr)  // 如果左子节点不为空
                {
                    q.push(cur->left);      // 将左子节点入队
                }

                if (cur->right != nullptr)  // 如果右子节点不为空
                {
                    q.push(cur->right);      // 将右子节点入队
                }
                
                v.push_back(cur->val); // 将当前节点的值存入当前层的数组
                q.pop();               // 当前节点处理完毕,出队

            }
            
            LevelSize = q.size(); // 更新下一层的节点数
            vv.push_back(v);      // 将当前层的节点值数组存入结果
        }
        return vv; // 返回最终结果
    }
};

四:易错点

错误1:忘记刷新v

解释:

vector<int> v;这句代码不能放在while的外面,我们放在两个while夹层中是因为,每次v存储完一层节点的值,将v放进vv后,则会创建一个新的v;所以这里的错误在于v没有被重新建立,此时需要在将v放进vv后,进行 v.clear();操作即可

错误1修正:

错误2:所有节点放进一个数组

解释:

不能单纯的以为用LevelSize是否>0来判断循环,因为你出一个LevelSize--,进一个LevelSize++,最后只会把所有节点的值存储进一个数组中,而不是每一层单独在一个数组中,由错误的输出结果也可知,vv中仅仅存放了一个数组

错误2,是思路的错误,无法修改

相关文章:

  • Implementing SAP BPC Embedded - 2nd Edition
  • 【unity】GPU顶点动画
  • 【推理】大模型ReasonGraph:推理路径的可视化论文及代码分析
  • 神聖的綫性代數速成例題3. 矩陣列數的極限、矩陣範數、行列式的計算
  • 【Agent】OpenManus 项目架构分析
  • LLMs之CoD:《Chain of Draft: Thinking Faster by Writing Less》翻译与解读
  • springboot+vue如何前后端联调,手搓前后端分离项目
  • 实验- 分片上传 VS 直接上传
  • redis终章
  • 五大基础算法——枚举算法
  • 蓝桥杯备赛 Day0_移动零
  • 从Online Softmax到FlashAttention
  • 100.HarmonyOS NEXT跑马灯组件教程:实际应用与场景示例
  • yungouos微信扫码登录demo示例(支持个人免费)
  • 使用c#进行串口通信
  • Python中@contextmanager上下文管理器
  • tkinter快键画布
  • CTF WEB题
  • Linux RT调度器之负载均衡
  • 火语言RPA--列表项内容获取
  • 经济日报社论:书写新征程上奋斗华章
  • 美国清洗政治:一幅残酷新世界的蓝图正在展开
  • 浦发银行一季度净利175.98亿增1.02%,不良率微降
  • 习近平访问金砖国家新开发银行
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查
  • 释新闻|西葡大停电为何规模大、恢复慢?可再生能源是罪魁祸首?