LeetCode刷题之HOT100之二叉树的直径

2024/5/25 阴天。这几天睡眠质量都非常好,一切似乎都在慢慢上升。先把题做了

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求就是给一个二叉树,求出两个节点之间的最大长度即为二叉树的直径。怎么做呢?我想不出来。看一下题解吧。题解给出的解法是深度优先搜索。我们来看看大致思路:

比如我们示例1给出的二叉树:我们知道[4,2,1,3]和[5,2,1,3]是最大长度即直径。那么我们可以将根节作为起点,搜索左边的儿子和右边的儿子,左边长度记为L,右边长度记为R。左边可以搜出[4,2]和[5,2],右边可以搜出[3]。那么最大长度为L + R + 1,即为max,而最终的直径为max - 1。递归找出最大的那个即为最终结果,下面看代码

3、代码演示

// 用于记录二叉树的直径
    int maxd ;
    public int diameterOfBinaryTree(TreeNode root) {
        // 初始化 maxd 为 1,因为至少有一个节点
        maxd = 1;
        // 调用 depth 函数计算树的深度,同时更新 maxd 的值
        depth(root);
        // 返回最大直径,即 maxd - 1
        return maxd - 1;
    }
    public int depth(TreeNode root ){
        // 如果当前节点为空,返回 0
        if(root == null){
            return 0;
        }
        // 递归计算左子树的深度
        int L = depth(root.left);
        // 递归计算右子树的深度
        int R = depth(root.right);
        // 更新 maxd 的值,取当前最大值和 L + R + 1 中的最大值
        maxd = Math.max(maxd, L + R + 1);
        // 返回当前节点的深度,即左右子树深度的最大值加 1
        return Math.max(L , R ) + 1;
    }

在IDE中运行一遍就顺畅了许多,递归这一思想真的很重要。时间复杂度:O(n),空间复杂度:O(height),height为树的高度。

ok,做完啦,再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值