第一次做到用两维数组返回,一开始还不知道怎么申请空间。两维数组看成一维数组,里面元素是一维数组,先申请一维数组空间,再申请元素一维数组里元素的空间。
解题思路:
返回值为一个层序遍历的二维数组,*returnsize行数,** returnColumnSizes列数用一个数组承装。首先动态开辟二维数组空间,列数空间,因为还不知道列数,先不开辟里面元素一维数组空间。
创建一队列,利用层序遍历思想,先将根节点入队,当队列不为空就要将队列里的结点保存到返回的二维数组中。
这里可以求出列数:等于队列尾指针减头指针(rear-front),将列数保存到列数数组中。随即开辟一维数组空间,然后就将结点出队,将数据保存到二维数组中。再将左右子树入队。这里要将之前入队的结点数据都要保存到二维数组中。
详见代码,有注释:
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
if(root==NULL){
*returnSize=0;
*returnColumnSizes=NULL;
return NULL;
}
int **res=(int **)malloc(sizeof(int *)*10001);//二维数组,申请一维数组空间
*returnColumnSizes=(int *)malloc(sizeof(int)*10001);//用一个数组保存列
struct TreeNode *queue[10001];
int front=0;
int rear=0;
*returnSize=0;/行
queue[++rear]=root;//将树节点入队
//int prefront=front;
struct TreeNode *T;
while(front!=rear){
//T=queue(++front);
res[*returnSize]=(int *)malloc(sizeof(int)*(rear-front));//申请一位数组元素空间
(*returnColumnSizes)[*returnSize]=rear-front;//列数等于入队元素个数
int col=0;
int prerear=rear;//要将rear保存,后面会左右子树入队会改变rear
while(front<prerear){//判断条件
T=queue[++front];
res[*returnSize][col]=T->val;
col++;
//为什么进入循环,要将这一层所有的左右子树都保存。左边的要保存,右边的也要保存
if(T->left){
queue[++rear]=T->left;
}
if(T->right){
queue[++rear]=T->right;
}
}
(*returnSize)++;//加括号
}
return res;
}