【LeetCode】102.二叉树的层序遍历
作者:互联网
【LeetCode】102.二叉树的层序遍历
/*
* 转载请说明出处与作者
* 作者:多巴胺dopamine
*/
一 问题描述
1 题目
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000
二 解题
1 解题思路
本题思路很简单,就是二叉树的层序遍历,属于基础题。
层序遍历的要点就是将每层的节点出队,其子节点入队。
借着本题顺便复习一下队列的知识点:
队列的结构、初始化、出队、入队、队列当前长度、队列是否为空、队列是否满。
2 话不多说,上代码(纯C 注释非常详细)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* 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().
*/
/*
* 定义一个队列结构
* 知识点:typedef 的使用,给改结构定义一个别名,详细使用见:https://www.runoob.com/cprogramming/c-typedef.html
*/
typedef struct {
// 队列
struct TreeNode **queue;
// 队首指针
int front;
// 队尾指针
int rear;
// 队列实际空间的最大长度
int maxsize;
}Queue;
void init();
void push();
struct TreeNode* pull();
int len();
bool is_empty();
bool is_full();
//* returnSize几行11行
//int** returnColumnSizes每行的个数
/*
* 解题函数
* 参数说明:
* returnSize,一共有几行;
* returnColumnSizes,是一个指向一个(一维)数组的指针,每行的元素个数。
*/
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
// leetcode 检测严格,声明一个指针,必须在这里开辟空间。否则有可能会报错
// 创建一个队列
Queue *q=(Queue *)malloc(sizeof(Queue));
// 为(*returnColumnSizes)开辟空间,一定要足够大,leetcode的测试数据给出了深度为2000的二叉树
*returnColumnSizes=(int *)malloc(sizeof(int)*2000);
// 初始化队列
init(q);
*returnSize=0;
// 如果根节点不为空,入队列
if(root){
// 入队函数
push(q,root);
}
// 程序最后返回的东西,一个二维数组。【i】【j】。i 是第几层,j 存的是该层的所有元素
int** return_numbers=(int**)malloc(sizeof(int*)*2000);
// 循环条件,队列不为空
while( !is_empty(q) ){
struct TreeNode* t;
// 查看当前队列的长度,即有多少个元素,这些元素都在一层
int length=len(q);
int i;
// *returnColumnSizes 记得加括号,不理解看运算符的优先级
(*returnColumnSizes)[*returnSize]=length;
// 根据(*returnSize)层有多少元素,开辟空间。return_numbers 是要最后 return 的东西
return_numbers[*returnSize]=(int *)malloc(sizeof(int)*length);
// 将该层的节点一个一个都从队列里取出来,存入需要return的数组里。
for(i=0; i< length; i++){
t=pull(q);
return_numbers[*returnSize][i]=t->val;
// 将其子节点入队,不用考虑其子节点是否是 NULL,这个在 push() 里做了限制,如果是 NULL 不会入队的
push(q,t->left);
push(q,t->right);
}
(*returnSize)++;
}
return return_numbers;
}
/*
* 队列初始化函数
*/
void init(Queue* q){
q->maxsize=5000;
q->front=0;
q->rear=0;
q->queue=(struct TreeNode**)malloc(sizeof(struct TreeNode*)*q->maxsize);
}
/*
* 入队函数(这里就不整循环队列了)
*/
void push(Queue* q,struct TreeNode* t){
// 约束:队列未满,且节点不是 NULL
if(!is_full(q) && t){
q->queue[(q->rear)++]=t;
}
}
/*
* 出队函数
*/
struct TreeNode* pull(Queue* q){
// 约束:队列不为空
if(!is_empty(q)){
struct TreeNode* t=q->queue[(q->front)++];
return t;
}else{
return NULL;
}
}
/*
* 队列是否满
*/
bool is_full(Queue* q){
if(q->rear==q->maxsize){
return true;
}else{
return false;
}
}
/*
* 队列是否空
*/
bool is_empty(Queue* q){
if(q->rear==q->front){
return true;
}else{
return false;
}
}
/*
* 队列当前长度
*/
int len(Queue* q){
return (q->rear)-(q->front);
}
三 总结
二叉树的层序遍历主要用到队列结构,属于基础知识,需要掌握,全当复习了。
标签:return,struct,int,层序,Queue,队列,二叉树,102,TreeNode 来源: https://www.cnblogs.com/yourdopamine/p/16606882.html