题目描述
对应LeetCode的第104题和第111题
BFS求最大深度
广度优先搜索是按照层级去遍历二叉树的
因此,我们可以在广度优先搜索的基础上
用一个变量depth去记录当前深度
每一轮外循环都对 depth+1
并嵌套内循环:
-将处于当前层级的节点都出队
-并将这些节点的所有子节点都入队
当遍历结束时,depth的值即为树的最大深度
var maxDepth = function(root) {
var depth=0
if(root!==null){
var queue=new Array()
queue.push(root)
while(queue.length > 0){
let levelSize=queue.length
depth++
for(let i=0;i<levelSize;i++){
let temp=queue.shift()
if(temp.left){
queue.push(temp.left)
}
if(temp.right){
queue.push(temp.right)
}
}
}
}
return depth
};
BFS求最小深度
整体思路与BFS求最大深度类似
但是在内循环中,需要对出队的节点进行判断
若此节点为叶子节点,则直接返回当前的depth
(事先封装一个isleaf方法,返回布尔值)
var isleaf=function(node){
if(!node.left && !node.right){
return true
}else{
return false
}
}
var minDepth = function(root) {
var depth=0
if(root!==null){
var queue=new Array()
queue.push(root)
while(queue.length > 0){
let levelSize=queue.length
depth++
for(let i=0;i<levelSize;i++){
let temp=queue.shift()
if(isleaf(temp)){
return depth
}
if(temp.left){
queue.push(temp.left)
}
if(temp.right){
queue.push(temp.right)
}
}
}
}
return depth
};
递归求最大深度
在这个题目的背景下,递归与分而治之的思想是类似的
要求一棵树的最大深度,相当于取 根节点的左子树的最大深度 与 右子树的最大深度 之间的最大值(再+1)
直到当前根节点为空,则返回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
}
递归求最小深度
原理与递归求最大深度一致
但需要注意的是
若 left (right) 的值为0
说明当前根节点只能取右(左)子树的最小深度
var minDepth = function(root) {
if(!root){
return 0
}
const left = minDepth(root.left)
const right = minDepth(root.right)
if(left===0){
return right+1
}
if(right===0){
return left+1
}
return Math.min(left,right) + 1
};