ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-19 23:34:14  阅读:154  来源: 互联网

标签:return struct int 层序 Queue 队列 二叉树 102 TreeNode


【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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有