稍微了解一点的人都知道,当我们需要从一个树结构中寻找到一些符合条件的元素时,我们都知道通过广度优先搜索或者深度优先搜索来有效地解决问题。那么具体是怎样一种手段去搜索呢?广度优先搜索(BFS)我们之前已经聊过了,现在我们就来谈谈深度优先搜索(DFS)。
DFS在某种程度上跟BFS很像,他们只是在侧重层级还是深度上有所区分。一般在做深度优先搜索的时候我们都选择使用递归的方式,除此外我们也可以像BFS一样使用辅助数据结构,比如说栈。所以通常我们的的深度优先搜索算法的空间复杂度都在O(H),这个H指的是树的深度。
老规矩,我们先来看一道需要用深度优先搜索解决的简单算法题:给定一个二叉树和一个数字“S”,判断是否存在从根节点到叶节点这样一个路径,使得这个路径上所有节点的和等于S。
从根节点到叶节点,这是典型的DFS题目。为了找到这样的路径,我们只能挨个去遍历每个路径。
我们来思考下具体步骤:
- 从二叉树的根节点开始深度优先搜索。
- 如果当前节点不是叶节点,我们要做两件事。
- 用当前和减去当前节点的值来得到一个新的和=> `S = S - node.value`。
- 对当前节点两个子节点都分别做上面这一步。
- 每一步我们都要看当前节点是不是叶节点,它的值是不是等于当前的和,