Leetcode

算法的核心思想是通过递归遍历整棵二叉树,在每个节点处计算它的左右子树的深度,并且利用这些深度来更新最大直径。详细解释如下:

算法思路:

  1. 递归遍历每个节点

    • 通过递归,从树的最底层(叶子节点)开始向上逐层计算每个节点的左右子树的深度。
    • 对于每个节点,递归函数depth()会先计算该节点的左子树深度和右子树深度。
  2. 更新最大直径

    • 对于每个节点,二叉树经过该节点的路径长度就是左子树的深度 + 右子树的深度。
    • maxDiameter变量用于记录当前的最大直径。如果当前节点的左右子树深度之和(即路径长度)大于已有的maxDiameter,就更新maxDiameter
  3. 返回节点的深度

    • depth()函数返回当前节点的深度,这个深度是该节点到其最深叶子节点的距离,具体为:
      [
      \text{深度} = \max(\text{左子树深度}, \text{右子树深度}) + 1
      ]
    • 递归结束时,这个返回值会被用于父节点的递归调用,帮助父节点计算它的深度和直径。

关键点:

  • 递归计算深度:每个节点的深度就是左右子树深度中的较大者加1,这个值递归地传递给上一级节点。
  • 最大直径更新:直径是在递归过程中不断更新的,通过对每个节点计算它的左右子树深度之和,并与当前最大直径比较,实时更新。

最终结果:

当递归结束时,maxDiameter中保存的就是整个树的最大直径。

图解:

举例说明,假设我们有以下二叉树:

        1
       / \
      2   3
     / \
    4   5
  1. 递归先从叶子节点453开始,计算它们的深度为1
  2. 节点2的左右子树深度分别为1(左)和1(右),所以节点2的深度为2,并且通过节点2的路径长度为1 + 1 = 2,此时更新直径为2
  3. 节点1的左右子树深度分别为2(左)和1(右),所以节点1的深度为3,通过节点1的路径长度为2 + 1 = 3,更新直径为3

因此,最终直径为3

这个算法的时间复杂度是O(N),因为我们访问每个节点一次,计算它的深度和更新最大直径。

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private int maxDiameter = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        depthoftree(root);
        return maxDiameter;
    }
    private int depthoftree(TreeNode root) {
        if(root == null) {
            return 0;
        }

        int leftsubtreedepth = depthoftree(root.left);
        int rightsubtreedepth = depthoftree(root.right);


        maxDiameter = Math.max(leftsubtreedepth + rightsubtreedepth, maxDiameter);
        
        return Math.max(leftsubtreedepth, rightsubtreedepth) + 1;
        
    }
}
相关推荐
&白帝&23 分钟前
JAVA JDK7时间相关类
java·开发语言·python
2301_8187320626 分钟前
用layui表单,前端页面的样式正常显示,但是表格内无数据显示(数据库连接和获取数据无问题)——已经解决
java·前端·javascript·前端框架·layui·intellij idea
狄加山67534 分钟前
系统编程(线程互斥)
java·开发语言
星迹日34 分钟前
数据结构:二叉树—面试题(二)
java·数据结构·笔记·二叉树·面试题
组合缺一36 分钟前
solon-flow 你好世界!
java·solon·oneflow
HHhha.1 小时前
JVM深入学习(二)
java·jvm
叩叮ING1 小时前
正则表达式中常见的贪婪词
java·服务器·正则表达式
组合缺一1 小时前
Solon Cloud Gateway 开发:熟悉 Completable 响应式接口
java·gateway·reactor·solon
组合缺一2 小时前
Solon Cloud Gateway 开发:Route 的配置与注册方式
java·gateway·reactor·solon
fks1432 小时前
leetcode 2412. 完成所有交易的初始最少钱数
leetcode