LeetCode 👉 HOT 100 👉 二叉树的最大深度 - 简单题

130 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

题目

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

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

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

示例1

 3
/ \
9  20
  /  \
 15   7

输入:[3,9,20,null,null,15,7],

输出:3

思路

题目考的是最基本的二叉树的遍历,对于这类型的题目,递归求解是最通用的解法;

定义一个函数 dfs(root, level) ,接收一个节点 root 和当前的层级 level

  • 判断当前节点是否存在,不存在就结束递归

  • level 和全局 maxLevel 取最大值

  • 继续递归节点的左右节点,把 level + 1

递归完整代码如下

    /**
     * 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)
     * }
     */
    var maxDepth = function(root) {
        let maxLevel = 0;

        const dfs = (root, level) => {
            if(!root) return;

            maxLevel = Math.max(maxLevel, level);

            // 递归遍历
            dfs(root.left, level + 1);
            dfs(root.right, level + 1);
        }

        dfs(root, 1);

        return maxLevel;
    };

思考: 上面的递归,是 深度优先遍历 的算法,即每找一个节点时,就继续遍历它的子树,直到子树为空,然后再依次往回找兄弟节点,再找兄弟节点的子树,直到整棵树遍历完成

但还有一种 广度优先遍历 算法,优先遍历兄弟节点,再遍历子节点;但通常广度优化,需要额外维护一个栈 stack

广度优先遍历完整代码

    /**
     * @param {TreeNode} root
     * @return {number}
     */
    var maxDepth = function(root) {
        let max = 0;

        if(!root) return max;
        
        const stack = [];
        stack.push(root);

        while(stack.length != 0) {
            const currentStackLength = stack.length;
            // 每一次 while 遍历,都是一层
            max++;
            for(let i = 0; i < currentStackLength; i++) {
                // 出栈
                const node = stack.shift();

                // 入栈
                if(node.left) stack.push(node.left);
                if(node.right) stack.push(node.right);
            }
        }

        return max;
    };


小结

简答题就快速做,把可能的解法都快速的过一遍,检验自己是不是真正的掌握了对应的解法。

LeetCode 👉 HOT 100 👉 二叉树的最大深度 - 简单题

合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍

如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄