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; 
    }
}
相关推荐
土司大王7 分钟前
LeetCode 79 单词搜索:Java 回溯模板、网格 DFS 与剪枝优化
java·算法·leetcode·深度优先
ECT-OS-JiuHuaShan12 分钟前
哲学是迭代学,数学是拓扑学
开发语言·人工智能·学习·算法·机器学习·php·拓扑学
All for pursuit.14 分钟前
【数组-5】560.和为K的子数组
数据结构·c++·算法·leetcode
Beyond_System|系统之外42 分钟前
【学编程】Python基础编程题100道(1-20)
java·数据结构·算法
维克兜率天1 小时前
【维克】一个极端值,毁掉了整个因子
大数据·人工智能·python·算法·机器学习
船厂电气自动化ai大模型1 小时前
AI大模型与数学 第75课 基、维度、向量空间坐标
数据结构·线性代数·算法·机器学习·推荐算法
博界IT精灵1 小时前
专题1:线性表
考研·算法
CSDN_RTKLIB2 小时前
树、图高层抽象模型
算法
Dola_Zou9 小时前
工厂智能排产软件算法保护与按产线计费实战
算法·自动化·软件工程·软件加密
啦啦啦啦啦zzzz11 小时前
Logger的组装(c++20)
c++·算法·c++20