【二叉树】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是二叉树的高度,递归调用栈的深度。
相关推荐
什巳7 小时前
JAVA练习309- 二叉树的层序遍历
java·数据结构·算法·leetcode
什巳10 小时前
JAVA练习306- 翻转二叉树
java·数据结构·算法·leetcode
smj2302_7968265210 小时前
解决leetcode第3989题网格中保持一致的最大列数
python·算法·leetcode
巧克力男孩dd11 小时前
Python超典型练习题(第一次作业)
开发语言·python·算法
爱刷碗的苏泓舒11 小时前
平方根信息滤波:矩阵推导及 GNSS 参数估计应用
线性代数·算法·矩阵·gnss·参数估计·测量平差·平方根信息滤波
想做小南娘,发现自己是女生喵12 小时前
第 2 章 顺序表和 vector
java·数据结构·算法
艾醒13 小时前
2026年第29周(7.13-7.19)AI全复盘:技术突破、行业趣闻翻车、算力服务器商业动态
人工智能·算法
雪碧聊技术13 小时前
动态规划算法—01背包问题
算法·动态规划
bu_shuo13 小时前
c与cpp中的argc和argv
c语言·c++·算法
普贤莲花13 小时前
【2026年第29周---写于20260718】---整理,断舍离
程序人生·算法·生活