hot100 543.二叉树的直径

思路:DFS,每个节点求它左右两边节点的最大深度之和,然后递归求最大值,在递归的过程中需要求出每个节点的深度。

1.本题有两个关键概念:

(1)链:从node的子树的叶子节点到node节点的路径,其实就是深度。

(2)直径:就是由两条(或者一条)链拼成的路径。

2.确定参数和返回值:

(1)参数:需传入根节点root。

(2)返回值:返回当前子树的深度。

3.确定终止条件:当前节点为null时,代表空节点,空节点的链长是-1。

4.确定单层递归的逻辑:

(1)左:求左子树的深度。

(2)右:求右子树的深度。

5.注意:直径可能在root下面的某个节点拐弯,不一定会经过root。

6.复杂度分析:

(1)时间复杂度:O(n),其中n为二叉树的节点个数。

(2)空间复杂度:O(n),最坏情况下,二叉树退化成一条链,递归需要O(n)的栈空间。

附代码:

java 复制代码
class Solution {
    //表示最长直径
    private int res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if(root == null || (root.left == null && root.right == null)){
            return 0;
        }
        //求最长直径
        maxDepth(root);
        return res;
    }

    private int maxDepth(TreeNode root){
        if(root == null){
            return 0;
        }
        //求左孩子的深度
        int leftDepth = maxDepth(root.left);
        //求右孩子的深度
        int rightDepth = maxDepth(root.right);
        //更新最长直径,最长直径就是某个节点的左孩子深度+右孩子深度
        res = Math.max(res,leftDepth + rightDepth);
        //返回给递归调用的上层,让上层节点知道这个子树的深度是多少
        return Math.max(leftDepth,rightDepth) + 1; 
    }
}
相关推荐
草履虫建模1 天前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq1 天前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq1 天前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq1 天前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)1 天前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi1 天前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱1 天前
牛客网刷题(2)
java·开发语言·算法
VT.馒头1 天前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头1 天前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱1 天前
IP校验和算法解析与实现
网络·tcp/ip·算法