力扣每日一刷Day 6

Practice Day six:Leetcode T102

在Day 5的时候,我们讲了深度优先搜索,那么广度优先搜索(BFS)也不能落下。

我们先来讲讲BFS的基本思想:

1 选取一个节点,对其进行搜索,若存在相邻节点,则记录。

2 搜索完当前节点后,按照一定的规则,搜索全部相邻节点,在搜索相邻节点的同时,需要记录当前搜索节点的相邻节点

3 重复步骤1与步骤2,直至搜索完全部节点

可以看到,上面涉及到记录,即存储。则我们需要选择一个合适的容器来实现这个方法。

细思基本思想,我们可以发觉,这涉及到一个先进先出(FIFO)的思想,我们可以很轻易的想到,队列(queue)是一个很适合实现上述方法的容器。

那么,解释完基本原理和实现逻辑后,我们就不能抛开题目不谈了。

题目的输出是要求我们展示一些数组,可以发现,这些数组都是每层的元素总和。为了存放这些数组,我们选择vector容器来存放他们。要说为什么选择他,因为他很智能,比如不用内存管理之类的,无论做什么,他都是不二之选。

这里需要注意一个地方,让我们看看题目第一个示例,你会发现,这里居然是个二维数组![ [  ] ],稍不注意,就会出错。所以,在构建存放输出的数组时,我们需要构建一个二维数组vector<vector<int>>ret。

这里需要补充一个知识点:数组在未进行初始化时,只创建了一个对象,不会往里面填充任何东西,所以未经初始化的数组为一个空数组,这与指针不同。

观察示例三,输入一个空节点,则我们的程序应该为此设计为输入空节点,则返回空数组。方便起见,我们直接返回我们上面创建的二维数组ret即可。

我们知道,只有在空节点时会触发这个指令,而空节点,也就是空指针通常被设置为nullptr,然后会被转化为false或0,这使得if,while等条件判断不能执行,则我们可以把触发条件设置为!root即可,也就是说,遇到空节点才执行,非空节点不执行。

此处队列的设计也是有门道在里头的。queue<TreeNode * root> q。这是因为我们的容器存入的是树的节点。而这是一个二叉树,把队列元素设为节点指针有助于我们方便的指出下一层的元素。

此时进行循环,由于我们是条件循环,直至队列为空为止,则我们使用while循环,即队列不为空。但我们但由于你不往队列塞东西,他就为空,则条件判断一直为假,那么我们就需要在循环前压入根节点作为起始,来开启这些循环。

进入循环后,我们需要为每一层的节点设立一个数组,用于存储每一层的元素。

然后是进行不断搜索节点,压入相邻节点的操作。由于这些操作的次数是个元素个数直接关联的,所以我们的循环是可以计数的,此处我们采用for循环,并利用size()函数来获知循环的次数。

直至队列无节点,终止循环。

以下是力扣官方的代码实现。

作者:力扣官方题解

链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/241885/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值