前端算法(61)

96 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],

   3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

题目解析

思路一

我们新建一个变量用于存放记录的最大深度,然后声明一个递归函数,第一个参数是数据,第二个参数代表着每一个节点的层级,递归函数中进行判断,如果当前数据不存在则直接返回,如果存在则只在叶子节点刷新最大深度变量并减少计算次数,在进行调用递归函数,最后在返回记录的最大深度

/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function (root) {
  let res = 0;
  const dns = (n, i) => {
    if (!n) return;
    if (!n.left && !n.right) res = Math.max(res, i);
    dns(n.left, i + 1);
    dns(n.right, i + 1);
  };
  dns(root, 1);
  return res;
};

思路二

首先,我们先判断节点是否为空,为空则返回0。然后,我们用递归,求父节点所在子树的深度就是求左右两个字数深度的最大值加1,也就是max(左子树的深度+右子树的深度)+1。最后我们通过递归可以找出根节点左右子树的深度,然后找到最大值加1即整个树的深度进行返回

/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function(root) {
    if(root===null){
        return 0;
    }else{
        let l = maxDepth(root.left);
        let r = maxDepth(root.right);
        return Math.max(l,r)+1;
    }
};

思路三

使用循环进行遍历,先做一下边界判断,在声明一个使用队列,声明一个变量用于记录层数,进行循环,队列的长度每次都会变,所以需要记录下层数,然后再根据当前队列的长度进行循环,因为当前当前队列的长度多少就表示这一层有多少个节点,循环结束,表示当前层遍历完毕,level加一层,最终返回即可

var maxDepth = function(root) {
    if(!root) return 0
    let queue = [root]
    let level = 0
    while(queue.length) {
        let len = queue.length
        for(let i = 0; i < len; i++) {
            let node = queue.shift()
            if(node.left) queue.push(node.left)
            if(node.right) queue.push(node.right)
        }
        level++
    }
    return level
};