*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;
}

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





