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; 
    }
}
相关推荐
Web极客码5 分钟前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习
程序猿乐锅8 分钟前
【数据结构与算法 | 第六篇】力扣1109,1094差分数组
java·算法·leetcode
wabs66643 分钟前
关于图论【广度优先搜索的理论基础】
算法·图论·宽度优先
孤魂2331 小时前
逻辑回归算法
算法·机器学习·逻辑回归
weixin_377634841 小时前
【多模型预测】 如何合理融合多个预测分值
算法·机器学习·概率论·预测·agent预测
无风听海1 小时前
Claude Agent Skills 的四种设计模式;从渐进式披露到最小权限
java·算法·设计模式
37.2℃9951 小时前
专业的Claude Design解决方案
前端·算法
め.1 小时前
定点数运算库
算法·unity
dyxal1 小时前
最长公共子序列(LCS)
python·算法
稚南城才子,乌衣巷风流4 小时前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法