以下是Leetcode 103题的解法,有注释
注释便于理解,最近在刷数据结构的题,快要刷完了
#define N 2000
int** zigzagLevelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
//初始化
*returnSize = 0;
if (root == NULL) return NULL;
int** ans = malloc(sizeof(int*) * N);
*returnColumnSizes = malloc(sizeof(int*) * N);
struct TreeNode* nodeQueue[N];
int left = 0, right = 0;
//取数
nodeQueue[right++] = root;
//记录从左至右还是从右至左,true从左往右,false从右往左
bool isOrderLeft = true;
while(left < right){
//双端队列
int levelList[N * 2];
int front = N, rear = N;
//size记录这一层的数据个数
int size = right - left;
for(int i = 0;i < size; ++i){
//取数
struct TreeNode* node = nodeQueue[left++];
//true 从左到右,false从右到左
if(isOrderLeft){
levelList[rear++] = node -> val;
}else{
levelList[--front] = node -> val;
}
//左右子节点
if(node -> left) {
nodeQueue[right++] = node ->left;
}
if(node -> right){
nodeQueue[right++] = node ->right;
}
}
//添加每一层的数值
int *tmp = malloc(sizeof(int) * (rear -front));
for(int i = 0;i < rear - front; i++){
tmp[i] = levelList[i + front];
}
//将每一层的数值填入ans
ans[*returnSize] = tmp;
//每一层是数值个数
(*returnColumnSizes)[*returnSize] = rear - front;
//循环下一层
(*returnSize)++;
//标记转换,true转换false
isOrderLeft = !isOrderLeft;
}
return ans;
}
由于本人技术有限还属于学习阶段,如有不足请大家指出。