一、前言
Medium 难度主要考察结合二叉树性质的 CRUD 操作,而这一切的基础都离不开遍历二叉树。
二叉树是图的子集,因而同样适用以下两种搜索思想:
-
**DFS(深度优先搜索):**沿着根节点递归下去,遇到叶子节点则向上回溯;
-
**BFS (广度优先搜索):**按照二叉树的层次访问,通常采用队列保存每个层次的节点。
由于二叉树本身的定义就是递归的,所以采用递归处理起来,代码更容易理解。但是递归的效率相对比较慢,主要原因在于:一个函数被调用的时间和空间成本开销很大,递归太多很可能导致调用栈溢出的问题。上一篇中也提到可以采用尾递归的书写方式,让 JavaScript 引擎去将递归优化成迭代,从而解决性能上的问题。
但是在一些情况下,尾递归并没有那么好写,所以本文会同时给出递归和迭代的解决方案。
接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。
二、102. 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。(即逐层地,从左到右访问所有节点)。
1、BFS
这道题目要求按层次遍历节点,很符合 BFS 搜索思想的定义,所以代码也很好理解。
这里需要利用队列(queue)来保存每