111. 二叉树的最小深度 JavaScript实现

111. 二叉树的最小深度

题目链接

一、递归(DFS)

递归找左右子树的最小深度,然后选更小的.这里使用的是深度优先遍历,也可以使用层次遍历。

与543.二叉树的直径相比:

  • 相同点:思想类似
  • 不同点:
    • 二叉树的直径的路径不一定是从根节点开始的,所以计算二叉树的直径的时候需要用ans去找到以每个节点为根节点的二叉树的节点数量。ans是左右子树的节点数量之和。
    • 计算最大最小深度一定是从根节点开始。最后的高度是左右子树其中最大或者最小的那个,而不是之和。
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDepth = function(root) {
    // 递归函数的出口
    if(!root) return 0
      
    // 计算以当前节点为根节点的二叉树的左右最小深度
    let left = minDepth(root.left)
    let right = minDepth(root.right)

    // 如果是一边没有节点的情况,如果取左右子树的最小深度,那么就是1.但是应该是最大的那个。
    if(root.left == null || root.right == null) return Math.max(left,right)+1

    // 如果两边都有节点,那么就返回的就是这个二叉树的最小的深度
    return Math.min(left,right)+1
};

二、BFS

使用层次遍历的思想,注意当检查到当前的节点的左右子树均为空的时候,那么当前节点所在的深度就是最小深度。

var minDepth = function(root) {
    if(!root) return 0

    let queue = []
    queue.push(root)
    let level = 0
    while(queue.length){
        let n = queue.length
        for(let i=0; i<n; i++){
            let node = queue.shift()

            // 节点没有左右子树,代表为最小深度,将当前深度+1,然后直接返回level,结束整个过程
            if(!node.left && !node.right ) {
                level++
                return level
            }
            if(node.left) queue.push(node.left)
            if(node.right) queue.push(node.right)
        }
        // 每层结束
        level++
    }
    return level
};

你可能感兴趣的:(leetcode刷题,#,二叉树,javascript,深度优先,leetcode,数据结构,算法)