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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。