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

力扣102:二叉树的层次遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

代码:

// returnSize:指向一个整数,用于返回结果二维数组的行数(即二叉树的层次数)
// returnColumnSizes:指向一个指针,该指针指向的数组用于存储二维数组每一行的列数(即每层节点个数)
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {
    // 初始化返回结果的行数为0
    *returnSize = 0;

    // 如果根节点为空,直接返回NULL,表示空树没有层次遍历结果
    if (root == NULL)
        return NULL;

    // 动态分配内存用于存储层次遍历结果的二维数组指针数组
    // 假设二叉树最多有2001层,这里分配足够的空间来存储每层节点值数组的指针
    int** returnNums = (int**)malloc(sizeof(int*) * 2001);

    // 为存储每层节点个数的数组动态分配内存,同样假设最多有2001层
    *returnColumnSizes = (int*)malloc(sizeof(int) * 2001);

    // 定义一个数组作为队列,用于辅助层次遍历,存储二叉树节点指针
    struct TreeNode* queueDat[2001];
    // 队列的队首索引,初始化为0,用于指示从队列取节点的位置
    int queueFront = 0;
    // 队列的队尾索引,初始化为0,用于指示向队列插入节点的位置
    int queueRear = 0;
    // 定义一个指针变量,用于临时存储当前正在处理的节点
    struct TreeNode* cur;

    // 将根节点放入队列中,然后队尾索引后移一位
    queueDat[queueRear++] = root;

    // 只要队列不为空,就进行循环处理每层节点
    while (queueFront!= queueRear) {
        // 用于记录当前层节点的个数,初始化为0
        int colSize = 0;
        // 记录当前层节点处理开始时队列的队尾位置(因为处理过程中队尾可能改变)
        int last = queueRear;

        // 为返回结果二维数组的当前行分配内存空间,大小根据当前层节点数量确定
        returnNums[*returnSize] = (int*)malloc(sizeof(int) * (last - queueFront));

        // 处理当前层的节点
        while (queueFront < last) {
            // 从队列中取出一个节点,赋值给cur,并将队首索引后移一位
            cur = queueDat[queueFront++];

            // 将当前节点的值存入返回结果二维数组的当前行、当前列位置
            // 每存入一个节点值,colSize就自增1
            returnNums[*returnSize][colSize++] = cur->val;

            // 如果当前节点有左子节点,将左子节点放入队列中,队尾索引后移
            if (cur->left!= NULL)
                queueDat[queueRear++] = cur->left;

            // 如果当前节点有右子节点,将右子节点放入队列中,队尾索引后移
            if (cur->right!= NULL)
                queueDat[queueRear++] = cur->right;
        }

        // 将当前层节点的个数存入存储每层节点个数的数组的当前行
        (*returnColumnSizes)[*returnSize] = colSize;

        // 表示已经处理完一层节点,返回结果二维数组的行数增加1
        (*returnSize)++;
    }

    // 返回层次遍历结果的二维数组,其中每一行存储二叉树一层的节点值
    return returnNums;
}


http://www.kler.cn/a/391318.html

相关文章:

  • 纯Dart Flutter库适配HarmonyOS
  • C++ 指针进阶:动态内存与复杂应用
  • 操作系统导论读书笔记
  • GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台
  • 【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
  • WebRTC搭建与应用(五)-Coturn踩坑记
  • OpenEuler 下 Docker 安装、配置与测试实例
  • [数组二分查找] 0153. 寻找旋转排序数组中最小值
  • Vite初始化Vue3+Typescrpt项目
  • C#自定义特性-SQL
  • 如何在 Ubuntu 上 部署 OceanBase
  • CosyVoice文本转语音:轻松创造个性化音频
  • 【LeetCode每日一题】——LCR 106.判断二分图
  • 自动化爬虫DrissionPage
  • golang 实现bitcoin core: bitcoin 椭圆曲线的“生成元”设置
  • 计算机网络:运输层 —— TCP/IP运输层中的两个重要协议
  • 基于Ubuntu2410脚本搭建OpenStack-D版
  • SSE与WebSocket与MQTT
  • STM32WB55RG开发(3)----生成 BLE 程序连接手机APP
  • Linux开发讲课49--- Linux 启动过程分析
  • 刘铁猛C#入门 024 类的声明,继承和访问控制
  • 微澜:用 OceanBase 搭建基于知识图谱的实时资讯流的应用实践
  • Nebula NGQL语言的使用 一
  • LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)
  • vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框
  • 智能科技赋能金融决策:中阳科技的数据分析解决方案