【二叉树】Leetcode 543. 二叉树的直径【简单】

二叉树的直径

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

示例1:

输入:root = 1,2,3,4,5

输出:3

解释:3 ,取路径 4,2,1,35,2,1,3 的长度。

解题步骤

  • 1、定义一个递归函数,用于计算以当前节点为根节点的二叉树的最大深度。
  • 2、对于每个节点,计算其左子树的最大深度和右子树的最大深度,并将其相加得到经过该节点的路径长度。
  • 3、更新全局变量maxDiameter,记录经过每个节点的最长路径长度。
  • 4、递归遍历所有节点,更新maxDiameter。
  • 5、最终maxDiameter即为二叉树的直径

Java实现

java 复制代码
public class DiameterOfBinaryTree {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }

    int diameter = 0;

    public int diameterOfBinaryTree(TreeNode root) {
        calculateDiameter(root);
        return diameter;
    }

    private int calculateDiameter(TreeNode node) {
        if (node == null) {
            return 0;
        }

        // 递归计算左子树和右子树的深度
        int leftDepth = calculateDiameter(node.left);
        int rightDepth = calculateDiameter(node.right);

        // 更新直径,为左右子树深度之和的最大值
        diameter = Math.max(diameter, leftDepth + rightDepth);

        // 返回当前节点的深度
        return Math.max(leftDepth, rightDepth) + 1;
    }

    // 测试实例
    public static void main(String[] args) {
        // 构造二叉树:         1
        //                  /    \
        //                 2      3
        //                / \
        //               4   5
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        // 创建 DiameterOfBinaryTree 实例
        DiameterOfBinaryTree diameterCalculator = new DiameterOfBinaryTree();

        // 计算直径
        int result = diameterCalculator.diameterOfBinaryTree(root);
        System.out.println("二叉树的直径为: " + result);
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中n是二叉树中的节点数,每个节点都需要访问一次。
  • 空间复杂度:O(height),其中height是二叉树的高度,递归调用栈的深度。
相关推荐
裕晟资质规划9 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
en.en..10 小时前
C语言 标准输入 / 输出缓冲区
算法
吃好睡好便好12 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球12 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
靠沿13 小时前
贪心算法专题(二)
算法·贪心算法
猎头南楼14 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生15 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂15 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康15 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备16 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法