【每日算法】力扣104. 二叉树的最大深度

119 阅读2分钟

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

描述

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

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

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

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

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

做题

深度优先/递归法

第一种做法就是从根节点一直遍历到叶子节点,然后比较树的深度,获取最大深度。

通过递归,先遍历左子节点,一直遍历到叶子节点,然后返回,每往上一层深度就 +1,这里把深度理解为高度会比较好。

    3
   / \
  9  20
    /  \
   15   7

像这里的节点(20),它的高度就取节点(15) & (7) 高度的最大值,如果 (15) 下面还有节点,组成的高度是 2,而 (7) 下面没有节点了,高度就是 1,那节点 (20) 的高度就是 2 + 1。

public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        int depth1 = maxDepth(root.left);
        int depth2 = maxDepth(root.right);
        return depth1>depth2?(depth1 + 1):(depth2 +1);
    }

image.png

广度优先/迭代法

这种做法是一层一层地遍历二叉树,直到没有叶子节点了。

    3
   / \
  9  20
    /  \
   15   7

第一次遍历的就是 (3),深度 + 1,发现它还有左右子节点。

第二次遍历的就是 (9,20),深度 + 1,发现 (20)有左右子节点。

第三次遍历的就是 (15,7),深度 + 1,都没有左右子节点了。

我们可以使用一个队列把要遍历的节点都存起来,每次要开始遍历时就记录一下要遍历几个,后面在遍历途中增加的节点就不要遍历了。

public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        int depth = 0;
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while(queue.size()!=0){
            int size = queue.size();
            while(size>0){
                TreeNode item = queue.poll();
                if(item.left !=null){
                    queue.offer(item.left);
                }
                if(item.right !=null){
                    queue.offer(item.right);
                }
                size--;
            }
            //每遍历完一层,深度 +1
            depth++;
        }
        return depth;
    }

image.png

最后

这两种做法基本上都是需要把整颗二叉树遍历一遍,这种题也是要这样,没办法,内存消耗上相差不大。

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。