“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述:
104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
二、思路分析:
树结构是链表的升级, 二叉树一分二,左右两个分支。
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
树与图的搜索算法常用 广度优先搜索、深度优先搜索。
广度优先搜索 BFS
BFS(Breadth First Search)属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
广度优先搜索使用队列(queue)来实现
深度优先搜索 DFS
DFS(Depth-First-Search)对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。深度优先搜索用栈(stack)来实现
解法1 DFS
栈 与 递归的思想类似,一直递进到树的最后一个节点null,并返回层数结果。
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
// 边界条件
if(!root){
return 0
}
// 每次返回层数+1,最后取最大层数
return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1
};
解法2 BFS
广度优先搜索 可以理解为 把每一层都列出来,按层的维度去遍历,直到最后一层无数据。
var maxDepth = function(root) {
// 判空
if(!root) return 0
let q = [root], // 父层队列
layer = 0 // 层数
while(q.length){ // 有数据说明没到底,就走向下一层
let next_level_queue = [] // 下一层队列
while(q.length > 0){
let node = q.shift() // 遍历q,把子项都放进 next_level_queue
if(!node) continue
if(node.left){
next_level_queue.push(node.left)
}
if(node.right){
next_level_queue.push(node.right)
}
}
q = next_level_queue
layer++
}
return layer
};
代码不够简练,再优化一下,通过记录q的长度,少用一个变量next_level_queue。
var maxDepth = function(root) {
if(!root) return 0
let q = [root],
layer = 0
while(q.length){
let len = q.length
while(len){
let node = q.shift()
if(node.left){
q.push(node.left)
}
if(node.right){
q.push(node.right)
}
len--
}
layer++
}
return layer
};
ok拉,拜拜~