leetcode 错误runtime error: load of null pointer of type 'int *' (__Serializer__.c)

本文详细解析了LeetCode第102题“层序遍历二叉树”的解题思路,分享了作者在解决空树情况时遇到的runtime error并成功修复的经历。文章强调了在条件判断位置的重要性,提供了正确的代码实现。

*runtime error: load of null pointer of type 'int ’ (Serializer.c)

错误解决

leetcode第102题层序遍历二叉树

笔者写时发现忘了算空树的情况
在这里插入图片描述
于是就在levelorder函数下第一行加上

if(root==NULL) return NULL;

于是,再次提交时奇怪的事情发生了

在这里插入图片描述

执行都过不了

然后去查,就发现了,leetcode的秘密
下面是官方讨论区的链接

https://support.leetcode-cn.com/hc/community/question/1018558/

调整一下
if(root==NULL) return NULL;
的位置,调到
(*returnSize)=0;
的后面就顺利通过了

下面附上代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

#define OK                  1
#define ERROR               0
#define INIT_LEVEL_SIZE     100
#define INCREMENT           10
typedef int                 Status;
typedef struct TreeNode*    QElemType;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr rear;//队尾指针
    QueuePtr front;//队头指针
}LinkQueue;

QElemType DeQueue(LinkQueue *Q);
Status EnQueue(LinkQueue *Q,QElemType e);
Status InitQueue(LinkQueue *Q);
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes);
 

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes)
{
	//if(root==NULL) return NULL;//原来在这里
    int size=INIT_LEVEL_SIZE; 
    *returnColumnSizes=(int*)malloc(sizeof(int)*size);
    (*returnSize)=0;
    if(root==NULL) return NULL;调到了这里
	*returnColumnSizes=(int*)malloc(sizeof(int)*size);	
    int **returnarray=(int**)malloc(sizeof(int*)*size);
    struct TreeNode* qroot=NULL;        
    int i=0;   
    LinkQueue Q;  
    InitQueue(&Q);	
    (*returnSize)=0;
    (*returnColumnSizes)[*returnSize]=1;
    EnQueue(&Q,root);  
	while((*returnColumnSizes)[*returnSize])
    {
       if((*returnSize)>=size-2)
       {
           size+=INCREMENT;
           (*returnColumnSizes)=(int*)realloc(*returnColumnSizes,sizeof(int)*size);
           returnarray=(int**)realloc(returnarray,sizeof(int*)*size);
       }//if
        //printf("*returnSize=%d\n",*returnSize);
        returnarray[*returnSize]=(int*)malloc(sizeof(int)*(*returnColumnSizes)[*returnSize]);      
        (*returnColumnSizes)[(*returnSize)+1]=0;       
        for(i=0;i<(*returnColumnSizes)[*returnSize];i++)
        {           
            qroot=DeQueue(&Q);           
            if(!qroot) break ;
			//printf("i=%d\tqroot->val=%d\n",i,qroot->val);        
            returnarray[*returnSize][i]=qroot->val;
            if(qroot->left)
            {	
                EnQueue(&Q,qroot->left);
                (*returnColumnSizes)[(*returnSize)+1]++;
            }//if
            if(qroot->right)
            {
                EnQueue(&Q,qroot->right);
                (*returnColumnSizes)[(*returnSize)+1]++;
            }
        }//for
        (*returnSize)++;
    }//while
    (*returnSize)+1;
    return returnarray;
}
/*  当前层节点数(*returnColumuSizes)[*returnSize]不为0,进入循环
    1.  如果(*returnSize)与size值达成一定关系,realloc(*returnColumn)
        和(**returnarray)的内存,size+=INCREMENT
    2.  将队列内(*returnColumnSizes)[*returnSize]个的元素出队列,
        malloc一个(*returnColumnSizes)[*returnSize]大小的空间给
        returnarray[*returnSize]指针,将出队列元素赋值给数组
        returnarray[*returnSize][] ([]下标最大为(*returnColumnSizes)[*returnSize]-1)
    3.  同时,若左右孩子非空,则进队列,(*returnColumuSizes)[*returnSize+1]计节点数,
    4.  (*returnSize)++
    
*/

Status InitQueue(LinkQueue *Q)
{//构造一个空队列
    if(!Q) return ERROR;
    Q->rear=Q->front=(QNode*)malloc(sizeof(QNode));
    if(!Q->front) return ERROR;
    Q->front->next=NULL;//傻子才会写Q->front=NULL;看什么,说的就是你
    return OK;

}
Status EnQueue(LinkQueue *Q,QElemType e)
{//插入元素,使元素e,成为新的队尾元素
    if(!Q) return ERROR;
    QNode* p=(QNode*)malloc(sizeof(QNode));
    if(!p) return ERROR;

    p->data=e;
    p->next=NULL;

    Q->rear->next=p;
    Q->rear=p;
    return OK;
}
QElemType DeQueue(LinkQueue *Q)
{//若队列不为空,则删除队列的头节点,并用e返回其值,并返回OK;否则,返回ERROR;
	QElemType e;
    if(!Q) return ERROR;
    if(Q->front==Q->rear) return NULL;
    QNode* p=Q->front->next;
    e=p->data;
    Q->front->next=p->next;
    if(Q->rear==p) Q->rear=Q->front;
    free(p);

    return e;

}

在这里插入图片描述

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值