思路:层序遍历的操作用队列完成。用C语言来写比较麻烦,你必须很清楚二维数组与二级指针的关系。二维数组若要用指针表示,必须用数组指针来表示。
- 前面都先执行初始化操作,并判断树是否为空。
- 生成队头指针,队尾指针,并生成一个cur指针来表示指向当前遍历的节点。
- 用front==rear来表示循环结束的条件,即队列为空。
- colSize表示每层节点的个数,其实就相当于二维数组的列号。last来表示每一层中最后节点的指针。
- 当front<last时,就代表遍历一层,先将front出队,然后判断左右孩子。
- 每遍历一层,则更新返回值。
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
*returnSize = 0;
if(root==NULL)
return NULL;
int **ret =(int**)malloc(sizeof(int*)*2000);
*returnColumnSizes =(int*)malloc(sizeof(int) *2000);
struct TreeNode *queue[2000];
struct TreeNode *cur;
int front= 0,rear = 0;
queue[rear++] = root;
while(front!=rear){
int colSize = 0;
int last = rear;
ret[*returnSize] = (int*)malloc(sizeof(int)*(last-front));
while(front < last){
cur = queue[front++];
ret[*returnSize][colSize++] = cur->val;
if(cur->left!=NULL)
queue[rear++] = cur->left;
if(cur->right!=NULL)
queue[rear++] = cur->right;
}
(*returnColumnSizes)[*returnSize] = colSize;
(*returnSize) ++ ;
}
return ret;
}