二叉树的直径
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
示例1:
输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
解题步骤
- 1、定义一个递归函数,用于计算以当前节点为根节点的二叉树的最大深度。
- 2、对于每个节点,计算其左子树的最大深度和右子树的最大深度,并将其相加得到经过该节点的路径长度。
- 3、更新全局变量maxDiameter,记录经过每个节点的最长路径长度。
- 4、递归遍历所有节点,更新maxDiameter。
- 5、最终maxDiameter即为二叉树的直径
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 5TreeNode 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是二叉树的高度,递归调用栈的深度。