思路详解:
构造一个按序存放每层结点的队列,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;//返回存放数值的二维数组
}