算法通关村—轻松搞定二叉树的最大深度

题目:LeetCode:104.二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

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

示例 1:
在这里插入图片描述

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

示例 2:
输入:root = [1,null,2]
输出:2

题目来源:LeetCode:104.二叉树的最大深度

题解

思路一:深度优先搜索(树的前序遍历)

如果只有一个节点 3,节点 3 没有左右子树,那么这颗二叉树的最大深度为 1
在这里插入图片描述

如果节点 3 有左子树,没有右子树,那么这颗二叉树的最大深度为:1 + 其左子树的最大深度
在这里插入图片描述

如果节点 3 有右子树,没有左子树,那么这颗二叉树的最大深度为:1 + 其右子树的最大深度
在这里插入图片描述

如果节点 3有左右子树,那么这颗二叉树的最大深度为:1 + 其左右子树中最大的深度
在这里插入图片描述

同理,来看以节点 20 为根节点的树,当其有左子树,没有右子树时,其最大深度可以表示为:1 + 其左子树的最大深度
在这里插入图片描述

以节点 20 为根节点的树,当其没有左子树,有右子树时,其最大深度可以表示为:1 + 其右子树的最大深度
在这里插入图片描述

以节点 20 为根节点的树,当其有左子树和右子树时,其最大深度可以表示为:1 + 其左右子树中最大的深度
在这里插入图片描述
从上述过程中我们可以看到,这颗二叉树的最大深度可以表示为:1 + max(leftDepth, rightDepth),所以可以考虑使用递归求解。这过程中会先访问根节点,如果根节点为 null 则返回 0 ,这是递归的终止条件,而根节点不为空时,会再递归的求解其左右子树的最大深度,递归结束后最终返回 1 + 其左右子树中最大的深度 这便是该二叉树的最大深度。

深度优先搜索 Java 代码实现

使用深度优先搜索解决二叉树的最大深度问题的 Java 代码如下所示:

 public int maxDepth(TreeNode root) {
    if(root == null){
        return 0;
    }
    int leftDepth = maxDepth(root.left);
    int rightDepth = maxDepth(root.right);
    return 1 + Math.max(leftDepth, rightDepth);
}

思路二:广度优先搜索(树的层序遍历)

树的最大层次也是树的最大深度。

我们可以用变量 res 来记录树的层数,用变量 size 来记录层序遍历过程中树各层元素的个数。

在进行树的层序遍历时,将树的各层元素依次入队和出队,当树中某层元素都已经出队时,size 变为 0,说明该层元素已经遍历完,让 res 加 1,表示树的层次加 1,当全部元素遍历完后,res 便是树的最大层次。

示例过程如下所示:

节点 3 入队列,size 变为 1,表示当前层的元素个数为 1
在这里插入图片描述

节点 3 出队列,节点 3 的左孩子节点 9 和右孩子节点 20 入队列,此时 size 变为 0,说明第 1 层元素已遍历完,res 加 1 ,表示层次加 1
在这里插入图片描述

在这里插入图片描述

节点 9 出队列,节点 9 没有左右孩子节点,无新节点入队,size 变为 1,说明该层还有 1 个元素没遍历完
在这里插入图片描述

节点 20 出队列,节点 20 的左孩子节点 15 和右孩子节点 7 入队列,size 变为 0,说明第 2 层元素已遍历完,res 加 1 ,表示层次加 1
在这里插入图片描述

在这里插入图片描述

节点 15 出队列,节点 15 没有左右孩子节点,无新节点入队,size 变为 1,说明该层还有 1 个元素没遍历完
在这里插入图片描述

节点 7 出队列,节点 7 没有左右孩子节点,无新节点入队,size 变为 0,说明第 3 层元素已遍历完,res 加 1 ,表示层次加 1
在这里插入图片描述
此时队列为空表示树中节点已经遍历完,res = 3 说明这颗二叉树的最大深度为 3

广度优先搜索 Java 代码实现

使用广度优先搜索解决二叉树的最大深度问题的 Java 代码如下所示:

public int maxDepth(TreeNode root) {
    if(root == null){
        return 0;
    }
    int res = 0;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while(!queue.isEmpty()){
        int size = queue.size();
        while(size > 0){
            TreeNode node = queue.poll();
            if(node.left != null){
                queue.offer(node.left);
            }
            if(node.right != null){
                queue.offer(node.right);
            }
            size--;
        }
        res++;
    }
    return res;
}

总结

本文通过深度优先搜索和广度优先搜索两种方式解决了 LeetCode:104.二叉树的最大深度问题。使用深度优先搜索解决时,要能够分析出问题的递归结构特征,而使用广度优先搜索解决时,要能够想清楚如何在遍历时将树的层次记录下来。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值