题目描述
题目传送门
使用c刷LeetCode简直是一种折磨。
这道题本身并不难,但是LeetCode给出的函数定义相当繁琐,如下:
/**
* 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().
*/
int **levelOrder(struct TreeNode *root, int *returnSize, int **returnColumnSizes);
其中 returnSize
是返回的二维数组的行数(数),returnColumnSizes
为每一行的列数(一维数组),又是指针又是数组的相当绕
参考代码
int **levelOrder(struct TreeNode *root, int *returnSize, int **returnColumnSizes)
{
if (!root)
{
*returnSize = 0;
return 0;
}
// front、rear 为队列的首尾指针,last用来指向每层的最后一个结点,columnSizes当前行的列数
int front = 0, rear = 0, last = 0, columnSizes = 0;
struct TreeNode **queue = (struct TreeNode **)malloc(sizeof(struct TreeNode) * 1000);
int **result = (int **)malloc(sizeof(int *) * 1000);
*returnColumnSizes = (int *)malloc(sizeof(int) * 1000);
struct TreeNode *p = NULL;
*returnSize = 0; //第一层,初始化为0
queue[front++] = root; //根节点入队
// 第一层只有根节点,存入二维数组的第一行,也就只有一列,故分配1个存储空间;
result[(*returnSize)] = (int *)malloc(sizeof(int) * (front - rear));
while (front != rear)
{
p = queue[rear++]; //根节点出队
result[(*returnSize)][columnSizes] = p->val;
columnSizes++;
if (p->left != NULL)
{
queue[front++] = p->left;
}
if (p->right != NULL)
{
queue[front++] = p->right;
}
// 前一个结点出队rear+1,故减1找到上一层的最后一个结点
if (rear - 1 == last)
{
(*returnColumnSizes)[(*returnSize)] = columnSizes; //记录当前层的结点个数
(*returnSize)++; //层数加一
result[(*returnSize)] = (int *)malloc(sizeof(int) * (columnSizes * 2)); //下一层的结点个数最多为本层结点个数的二倍
last = front - 1; //下一层的结点都已全部入队,故此时队列的最后一个结点就是下一层的最后一个结点
columnSizes = 0;
}
}
return result;
}
LeetCode的检查机制很严格,一不留神会出现空指针、数组越界、堆栈溢出等,
样例测试
本题没有样例输入和样例输出,下面给出 主函数和二叉树创建
typedef struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
struct TreeNode *createBiTree();
int main()
{
int i, j, returnSize, *returnColumnSizes;
TreeNode *T = createBiTree();
int **order = levelOrder(T, &returnSize, &returnColumnSizes);
for (i = 0; i < returnSize; i++)
{
for (j = 0; j < returnColumnSizes[i]; j++)
{
printf("%d ", order[i][j]);
}
putchar('\n');
}
return 0;
}
struct TreeNode *createBiTree()
{
int ch;
struct TreeNode *T;
scanf("%d", &ch);
if (ch > 0)
{
T = (struct TreeNode *)malloc(sizeof(struct TreeNode));
T->val = ch;
T->left = createBiTree();
T->right = createBiTree();
}
else
{
T = NULL;
}
return T;
}
样例输入
3 9 0 0 20 15 0 0 7 0 0
样例输出
3
9 20
15 7