算法题解记录14+++二叉树的最大深度(百日筑基)

文章讲述了如何使用递归方法求解二叉树的最大深度问题,强调了从根节点开始,考虑左右子树深度并返回较大值加1的过程。作者通过实例和递归逻辑解析,帮助读者理解这一经典算法应用。
摘要由CSDN通过智能技术生成

        本题主要的学习重点是理解递归。

题目描述:

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

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

解题准备:

        1.了解二叉树:二叉树是递归定义而来,其定义在有限的结点集中,由三个不相交的结点集合组成,分别是根节点、左子树结点和右子树结点。

        2.了解可能涉及的基本操作:第一,既然需要得到最大深度,大概率需要遍历所有结点,也就是涉及查找,其余目前看不出来。。总结,大概率有查找。

解题难点1分析:

        难点1:对每一个结点,都可能有两个选择。

                比如根节点root,无法确定最大深度会在左子树还是右子树。

                拆分化简:如果仅求最左链上的深度,如何求?

                        定义:最左链是指,对每一个结点,都取左子树(左子结点)。【比如图一,就是3->9->null,如果有更多,则另说】

                        那就非常简单了,首先,树的实现基于链表(其左子、右子甚至可以看成一条链表),所以本题目完全可以看成一条链表。

                        可以while(root!=null){depth++; root=root.next;}

                        当然,本化简的目标是学习一种操作:递归。

                递归:

                        递归,用不准确的比喻来理解,就是求解A,需要到B处找答案;求解B,又要到C处找答案;;;这样一直循环下去,直到找到第一个有答案的人【即到达结束条件】,才顺序返回。

        对于链式结构,最常见的递归格式如下:    

public int f(Type data){
    if(data==null){
        return 0;
    }
    return f(data.next);
}

        当然,学一个东西不能只学形式,递归的本质,就是把大问题分解成小问题,比如求根节点最左链的深度,其本质就是求根节点左子树的深度+1;;其左子树的深度,就是左子树的左子树的深度+1……直到左子树为null,null树的深度为0,返回0,接着其它数据分步计算,最终得到结果。

        难点1思路:

                对于本题,每个结点,有两个可能的解。

                从二叉树的定义出发,root的左、右子树都是一棵二叉树,那么对于root,root的最大深度,就是左子树、或者右子树的最大深度+1。

                当然,这里要判断左子、或者右子树谁更大?

                如果用递归的思路,直接就可以得出:根节点root的最大深度,就等于max(左子树,右子树)+1。

                定义结束条件:

                        对于最左链,如果root==null,那么返回0。

                        对于本题,其实同理,因为将左、右结点都传递过去了,不必担心缺少的问题。

代码:

class Solution {
    public int maxDepth(TreeNode root) {
        return f(root);
    }
    private int f(TreeNode root){
        if(root==null){ // 如果是null,则返回0
            return 0;
        }
        int l=f(root.left); // 递归查找左子树的最大深度
        int r=f(root.right); // 递归查找右子树的最大深度

        return Math.max(l, r)+1; // 找到后+1
    }
}

以上内容即我想分享的关于力扣热题14的一些知识。

        我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

                        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值