携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
深度优先搜索
深度优先搜索(Depth-First-Search),简称DFS。
有个比较好理解深度优先搜索的例子:走迷宫。先沿着一条路一直往前走,不撞南墙不回头,直到走不下去为止,然后再接着走第二条路,第三条路...
深度优先搜索的原理大体是这样,与广度优先搜索明显不同,DFS相当于先纵向搜索,BFS是先横向搜索。
我们用二叉树来详细说明。
二叉树的最大深度
描述
二叉树的最大深度可以理解为根节点root到任一叶子节点的最大节点数。如下图所示:二叉树的最大深度是4,其中1->2->4->5或1->2->4->6的深度都是4。
分析
- 如果二叉树为空,那最大深度就是0,直接返回
- 当二叉树存在节点时,分别计算左右节点的高度,取两者最大值
- 二叉树最大深度是在左右节点最大值基础上加一个跟节点
实现
var maxDepth = function(root) {
if (!root) return 0
const left = maxDepth(root.left) // 递归左节点
const right = maxDepth(root.right) // 递归右节点
return Math.max(left, right) + 1
};
我们根据上图,来模拟下具体步骤,看递归是怎么一步步执行的。
- root为
[1,2,7,3,4,null,null,null,null,5,6],非空,作为入参首次执行maxDepth方法 - 取root的左节点继续执行maxDepth方法,入参为
[2,3,4,null,null,5,6] - 继续左节点查询,这时候到了第三层,root为
[3],不再有左右节点了 - 然后就看同一层的右侧节点,root变成了
[4,5,6] - 再看节点4存在左节点,继续执行maxDepth方法
- 节点5是叶子节点,直接返回
- 再执行第四层的右节点6,也是叶子节点
- 到此为止,顶层1节点的左节点数据都已遍历,root自然就到了右节点7