2种方法(递归+BFS)求二叉树的最小/最大深度

题目描述

对应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
};