/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * @author Senky * @date 2023.07.28 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1 * @brief 层序遍历就要用到队列先进先出的特性了,队列的结构就直接写出\入队, * 其余的就是队列元素操作上的一些小细节:主要就是malloc申请的空间大小的扩展和的指向 * @param root TreeNode类 * @return int整型二维数组 * @return int* returnSize 返回数组行数 * @return int** returnColumnSizes 返回数组列数 */ //队列结构体 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct QueueNode { struct TreeNode* Tree_Node; struct QueueNode* next; }; struct Queue { struct QueueNode* front; struct QueueNode* rear; int length; }; // 创建一个空队列 struct Queue* Queue_create() { struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue)); queue->front = queue->rear = NULL; queue->length = 0; return queue; } // 入队 void Queue_in(struct Queue* queue, struct TreeNode* Tree_Node) { struct QueueNode* newNode = (struct QueueNode*)malloc(sizeof(struct QueueNode)); newNode->Tree_Node = Tree_Node; newNode->next = NULL; if (queue->length == 0) { queue->front = queue->rear = newNode; } else { queue->rear->next = newNode; queue->rear = newNode; } queue->length++; } // 出队 struct TreeNode* Queue_out(struct Queue* queue) { if (queue->length == 0) { return NULL; } struct TreeNode* Tree_Node = queue->front->Tree_Node; struct QueueNode* temp = queue->front; queue->front = queue->front->next; if (queue->front == NULL) { queue->rear = NULL; } free(temp); queue->length--; return Tree_Node; } //层序遍历二叉树 int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) { if (root == NULL) { *returnSize = 0; *returnColumnSizes = NULL; return NULL; } struct Queue* queue = Queue_create(); Queue_in(queue, root); int** result = (int**)malloc(sizeof(int*)); *returnSize = 0; //本题规模大概最多有20层,所以申请20个空间够用了 *returnColumnSizes = (int*)calloc(20,sizeof(int)); int currentLevel = 0; int levelNodes = 1; // 当前层节点数 while (queue->length != 0) { levelNodes = queue->length; // 创建一个动态数组来保存当前层的节点值 int* currentLevelNodes = (int*)malloc(levelNodes * sizeof(int)); for (int i = 0; i < levelNodes; i++) { struct TreeNode* node = Queue_out(queue); currentLevelNodes[i] = node->val; if (node->left) { Queue_in(queue, node->left); } if (node->right) { Queue_in(queue, node->right); } } // 将当前层的动态数组保存到result中 result = (int**)realloc(result, (currentLevel + 1) * sizeof(int*)); result[currentLevel] = currentLevelNodes; // 更新当前层节点数和返回数组列数 (*returnColumnSizes)[currentLevel] = levelNodes; currentLevel++; (*returnSize)++; } free(queue); return result; }