其他分享
首页 > 其他分享> > 【LeetCode】102.二叉树的层序遍历

【LeetCode】102.二叉树的层序遍历

作者:互联网

【LeetCode】102.二叉树的层序遍历


/*
*  转载请说明出处与作者
*  作者:多巴胺dopamine
*/

一 问题描述

1 题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
tree1.jpg

输入: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