1.力扣原题
2.关于队列简介
在C语言中,队列是一种常见的数据结构,它一般遵循先进先出(FIFO)的原则。队列可以看作是一种线性表,但是只能在一端插入元素(称为入队),在另一端删除元素(称为出队)。接下来我们来了解一个常用的顺序队列。
比如放学了你要到学校的门口接你家哥哥,大家都依次在校门前排队等待,两边有栅栏,保持队形
大家依次从栅栏尾部进入等待人来接,这个就是入队。
那什么叫出队?
此时路人乙的家长来接路人乙,路人乙又刚好在队首,故能成功接到,这就是出队。那现在你能接到你家哥哥吗?很显然不能,因为他不在队首,而且路人甲和纯路人是在他前面入队的。按照队列的先进先出,还要等到它们两出队了,哥哥才能出队。
3.关于广度优先简介
C语言的广度优先搜索(BFS)是一种图遍历算法,用于在一个图中搜索并遍历所有的顶点。它从一个起始顶点开始,依次访问该顶点的所有邻接顶点,然后再访问邻接顶点的邻接顶点,以此类推,直到遍历完所有可达的顶点。BFS算法使用队列来实现。首先,将起始顶点入队列,并标记为已访问。然后,从队列中取出一个顶点,访问该顶点,并将其所有未访问的邻接顶点入队列。重复这个过程,直到队列为空。
4,实现代码解读
先定义一个链表的结构体作为队列的元素,然后用广度优先的思想逐层遍历二叉树,每遍历一层记录值加一,即可得到二叉树的最大深度。
冷知识:
你可以注意到inQueue()函数的第一个参数用了双层的指针,这是因为要想在函数内部改变一个地址或变量的值并且影响到函数外面,需要使用这个地址或变量的地址来进行操作。因为函数的形参只是原始地址或变量的副本。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//链表队列结构体
typedef struct queue
{
struct TreeNode* now;
struct queue* next;
}QueueType;
//加入链表队列函数
void inQueue(QueueType** a,struct TreeNode* b)
{
(*a)=(QueueType*)malloc(sizeof(QueueType));
(*a)->now=b;
(*a)->next=NULL;
}
int maxDepth(struct TreeNode* root){
if(root==NULL)return 0;
int queueSize=1,qsize=0,maxSize=0;
//队列首指针
QueueType* left=NULL;
//队列尾指针
QueueType* right=NULL;
//初始化
inQueue(&left,root);
right=left;
//队头节点不为空继续
while(left!=NULL)
{
qsize=0;
//当前节点长度大于零继续
while(queueSize>0)
{
//广度优先算法的思想,将当前节点的子字节点都入队
if(left->now->left!=NULL)
{
//入队
inQueue(&right->next,left->now->left);
//移动指针,使right保持在队列的尾部
right=right->next;
//记录下一个要遍历的队列长度
qsize++;
}
if(left->now->right!=NULL)
{
inQueue(&right->next,left->now->right);
right=right->next;
qsize++;
}
//上一层的节点依次出队
left=left->next;
//当前队列长度减小
queueSize--;
}
//更新下一次要遍历的队列长度
queueSize=qsize;
//当前最大深度
maxSize++;
}
return maxSize;
}
动图演示