[力扣刷题]102.二叉树的层序排列【C语言】

思路详解:

构造一个按序存放每层结点的队列,struct TreeNode* queen[2010],双循环依次处理每层结点。用 front 和 last 分别标明该层需要处理的结点个数,用来卡第二层循环的条件。

难点:

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){}

*returnSize代表函数结束时需返回的层数
int** returnColumnSizes 代表函数结束时每行需要存放的结点

(* returnColumnSizes)[*returnSize]=colSize表示每行有colSize个结点.

一个二维动态整形数组的申请有两个步骤:
1.int** res=(int**)malloc(sizeof(int*)*2010);
2.res[*returnSize]=(int *)malloc(sizeof(int)*(last-front))

C语言代码及详解如下:

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
     *returnSize = 0;//*returnSize为有多少层,设置返回的层数
    if(root==NULL){
        return NULL;
    }
    int** res=(int**)malloc(sizeof(int*)*2010);//创建二维数组存放每层的val值 
    *returnColumnSizes = (int*)malloc(sizeof(int) * 2000);
    int front=0,rear=1;//设置队列的起始和终止位置
    struct TreeNode* queen[2010];//建立存放结点的队列
    queen[0]=root;//根入队
    struct TreeNode* cur;
    while(front<rear){
        int colSize=0,last=rear;//colSize设置一行上存在的结点个数,last为记录一层有多少个结点
        res[*returnSize]=(int *)malloc(sizeof(int)*(last-front));//last-front为该层有多少个结点
            while(front<last){//处理每一层的每个结点
                cur=queen[front++];
                res[*returnSize][colSize++]=cur->val;
                if(cur->left!=NULL){
                    queen[rear++]=cur->left;//左子树入队
                }
                if(cur->right!=NULL){
                    queen[rear++]=cur->right;//右子树入队
                }
            }
        (* returnColumnSizes)[*returnSize]=colSize;//每行有colSize个结点
        (*returnSize)++;//行数+1
    }
    return res;//返回存放数值的二维数组
}

运行结果:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值