zoukankan      html  css  js  c++  java
  • 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
    };
    
  • 相关阅读:
    webpack学习笔记--配置总结
    webpack学习笔记--多种配置类型
    webpack学习笔记--整体配置结构
    webpack学习笔记--其它配置项
    webpack学习笔记--配置devServer
    webpack学习笔记--配置plugins
    webpack学习笔记--配置resolve
    webpack学习笔记--配置module
    webpack学习笔记--配置output
    webpack学习笔记--配置entry
  • 原文地址:https://www.cnblogs.com/baebae996/p/13930676.html
Copyright © 2011-2022 走看看